Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (207 commits) [SCSI] gdth: fix CONFIG_ISA build failure [SCSI] esp_scsi: remove __dev{init,exit} [SCSI] gdth: !use_sg cleanup and use of scsi accessors [SCSI] gdth: Move members from SCp to gdth_cmndinfo, stage 2 [SCSI] gdth: Setup proper per-command private data [SCSI] gdth: Remove gdth_ctr_tab[] [SCSI] gdth: switch to modern scsi host registration [SCSI] gdth: gdth_interrupt() gdth_get_status() & gdth_wait() fixes [SCSI] gdth: clean up host private data [SCSI] gdth: Remove virt hosts [SCSI] gdth: Reorder scsi_host_template intitializers [SCSI] gdth: kill gdth_{read,write}[bwl] wrappers [SCSI] gdth: Remove 2.4.x support, in-kernel changelog [SCSI] gdth: split out pci probing [SCSI] gdth: split out eisa probing [SCSI] gdth: split out isa probing gdth: Make one abuse of scsi_cmnd less obvious [SCSI] NCR5380: Use scsi_eh API for REQUEST_SENSE invocation [SCSI] usb storage: use scsi_eh API in REQUEST_SENSE execution [SCSI] scsi_error: Refactoring scsi_error to facilitate in synchronous REQUEST_SENSE ...
This commit is contained in:
@@ -1,15 +1,19 @@
|
||||
|
||||
menu "Fusion MPT device support"
|
||||
menuconfig FUSION
|
||||
bool "Fusion MPT device support"
|
||||
depends on PCI
|
||||
---help---
|
||||
Say Y here to get to see options for Fusion Message
|
||||
Passing Technology (MPT) drivers.
|
||||
This option alone does not add any kernel code.
|
||||
|
||||
config FUSION
|
||||
bool
|
||||
default n
|
||||
If you say N, all options in this submenu will be skipped and disabled.
|
||||
|
||||
if FUSION
|
||||
|
||||
config FUSION_SPI
|
||||
tristate "Fusion MPT ScsiHost drivers for SPI"
|
||||
depends on PCI && SCSI
|
||||
select FUSION
|
||||
select SCSI_SPI_ATTRS
|
||||
---help---
|
||||
SCSI HOST support for a parallel SCSI host adapters.
|
||||
@@ -20,11 +24,11 @@ config FUSION_SPI
|
||||
LSI53C1020A
|
||||
LSI53C1030
|
||||
LSI53C1035
|
||||
ATTO UL4D
|
||||
|
||||
config FUSION_FC
|
||||
tristate "Fusion MPT ScsiHost drivers for FC"
|
||||
depends on PCI && SCSI
|
||||
select FUSION
|
||||
select SCSI_FC_ATTRS
|
||||
---help---
|
||||
SCSI HOST support for a Fiber Channel host adapters.
|
||||
@@ -37,12 +41,13 @@ config FUSION_FC
|
||||
LSIFC929
|
||||
LSIFC929X
|
||||
LSIFC929XL
|
||||
LSIFC949X
|
||||
LSIFC949E
|
||||
Brocade FC 410/420
|
||||
|
||||
config FUSION_SAS
|
||||
tristate "Fusion MPT ScsiHost drivers for SAS"
|
||||
depends on PCI && SCSI
|
||||
select FUSION
|
||||
select SCSI_SAS_ATTRS
|
||||
---help---
|
||||
SCSI HOST support for a SAS host adapters.
|
||||
@@ -53,10 +58,10 @@ config FUSION_SAS
|
||||
LSISAS1068
|
||||
LSISAS1064E
|
||||
LSISAS1068E
|
||||
LSISAS1078
|
||||
|
||||
config FUSION_MAX_SGE
|
||||
int "Maximum number of scatter gather entries (16 - 128)"
|
||||
depends on FUSION
|
||||
default "128"
|
||||
range 16 128
|
||||
help
|
||||
@@ -104,7 +109,6 @@ config FUSION_LAN
|
||||
|
||||
config FUSION_LOGGING
|
||||
bool "Fusion MPT logging facility"
|
||||
depends on FUSION
|
||||
---help---
|
||||
This turns on a logging facility that can be used to debug a number
|
||||
of Fusion MPT related problems.
|
||||
@@ -113,7 +117,7 @@ config FUSION_LOGGING
|
||||
|
||||
echo [level] > /sys/class/scsi_host/host#/debug_level
|
||||
|
||||
There are various debug levels that an be found in the source:
|
||||
There are various debug levels that can be found in the source:
|
||||
file:drivers/message/fusion/mptdebug.h
|
||||
|
||||
endmenu
|
||||
endif # FUSION
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_cnfg.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2004 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_fc.h
|
||||
|
@@ -3,7 +3,7 @@
|
||||
MPI Header File Change History
|
||||
==============================
|
||||
|
||||
Copyright (c) 2000-2007 LSI Logic Corporation.
|
||||
Copyright (c) 2000-2007 LSI Corporation.
|
||||
|
||||
---------------------------------------
|
||||
Header Set Release Version: 01.05.16
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_init.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_ioc.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2004 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_lan.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2001 LSI Logic Corporation. All rights reserved.
|
||||
* Copyright (c) 2000-2001 LSI Corporation. All rights reserved.
|
||||
*
|
||||
* NAME: fc_log.h
|
||||
* SUMMARY: MPI IocLogInfo definitions for the SYMFC9xx chips
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Copyright 2003 LSI Logic Corporation. All rights reserved. *
|
||||
* Copyright 2003 LSI Corporation. All rights reserved. *
|
||||
* *
|
||||
* Description *
|
||||
* ------------ *
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2007 LSI Logic Corporation.
|
||||
* Copyright (c) 2001-2007 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_raid.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2006 LSI Logic Corporation.
|
||||
* Copyright (c) 2004-2006 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_sas.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2004 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_targ.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2005 LSI Logic Corporation.
|
||||
* Copyright (c) 2001-2005 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_tool.h
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 LSI Logic Corporation.
|
||||
* Copyright (c) 2000-2004 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi_type.h
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -3,9 +3,9 @@
|
||||
* High performance SCSI + LAN / Fibre Channel device drivers.
|
||||
* For use with PCI chip/adapter(s):
|
||||
* LSIFC9xx/LSI409xx Fibre Channel
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -68,15 +68,15 @@
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
||||
#ifndef MODULEAUTHOR
|
||||
#define MODULEAUTHOR "LSI Logic Corporation"
|
||||
#define MODULEAUTHOR "LSI Corporation"
|
||||
#endif
|
||||
|
||||
#ifndef COPYRIGHT
|
||||
#define COPYRIGHT "Copyright (c) 1999-2007 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.05"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.05"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.06"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.06"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
@@ -186,12 +186,42 @@
|
||||
* MPT drivers. NOTE: Users of these macro defs must
|
||||
* themselves define their own MYNAM.
|
||||
*/
|
||||
#define MYIOC_s_FMT MYNAM ": %s: "
|
||||
#define MYIOC_s_DEBUG_FMT KERN_DEBUG MYNAM ": %s: "
|
||||
#define MYIOC_s_INFO_FMT KERN_INFO MYNAM ": %s: "
|
||||
#define MYIOC_s_NOTE_FMT KERN_NOTICE MYNAM ": %s: "
|
||||
#define MYIOC_s_WARN_FMT KERN_WARNING MYNAM ": %s: WARNING - "
|
||||
#define MYIOC_s_ERR_FMT KERN_ERR MYNAM ": %s: ERROR - "
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* ATTO UL4D associated structures and defines
|
||||
*/
|
||||
#define ATTOFLAG_DISC 0x0001
|
||||
#define ATTOFLAG_TAGGED 0x0002
|
||||
#define ATTOFLAG_WIDE_ENB 0x0008
|
||||
#define ATTOFLAG_ID_ENB 0x0010
|
||||
#define ATTOFLAG_LUN_ENB 0x0060
|
||||
|
||||
typedef struct _ATTO_DEVICE_INFO
|
||||
{
|
||||
u8 Offset; /* 00h */
|
||||
u8 Period; /* 01h */
|
||||
u16 ATTOFlags; /* 02h */
|
||||
} ATTO_DEVICE_INFO, MPI_POINTER PTR_ATTO_DEVICE_INFO,
|
||||
ATTODeviceInfo_t, MPI_POINTER pATTODeviceInfo_t;
|
||||
|
||||
typedef struct _ATTO_CONFIG_PAGE_SCSI_PORT_2
|
||||
{
|
||||
CONFIG_PAGE_HEADER Header; /* 00h */
|
||||
u16 PortFlags; /* 04h */
|
||||
u16 Unused1; /* 06h */
|
||||
u32 Unused2; /* 08h */
|
||||
ATTO_DEVICE_INFO DeviceSettings[16]; /* 0Ch */
|
||||
} fATTO_CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_ATTO_CONFIG_PAGE_SCSI_PORT_2,
|
||||
ATTO_SCSIPortPage2_t, MPI_POINTER pATTO_SCSIPortPage2_t;
|
||||
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* MPT protocol driver defs...
|
||||
@@ -307,7 +337,8 @@ typedef struct _SYSIF_REGS
|
||||
u32 Reserved2[2]; /* 38-3F reserved for future use */
|
||||
u32 RequestFifo; /* 40 Request Post/Free FIFO */
|
||||
u32 ReplyFifo; /* 44 Reply Post/Free FIFO */
|
||||
u32 Reserved3[2]; /* 48-4F reserved for future use */
|
||||
u32 RequestHiPriFifo; /* 48 Hi Priority Request FIFO */
|
||||
u32 Reserved3; /* 4C-4F reserved for future use */
|
||||
u32 HostIndex; /* 50 Host Index register */
|
||||
u32 Reserved4[15]; /* 54-8F */
|
||||
u32 Fubar; /* 90 For Fubar usage */
|
||||
@@ -649,9 +680,9 @@ typedef struct _MPT_ADAPTER
|
||||
u8 reload_fw; /* Force a FW Reload on next reset */
|
||||
u8 NBShiftFactor; /* NB Shift Factor based on Block Size (Facts) */
|
||||
u8 pad1[4];
|
||||
int DoneCtx;
|
||||
int TaskCtx;
|
||||
int InternalCtx;
|
||||
u8 DoneCtx;
|
||||
u8 TaskCtx;
|
||||
u8 InternalCtx;
|
||||
spinlock_t initializing_hba_lock;
|
||||
int initializing_hba_lock_flag;
|
||||
struct list_head list;
|
||||
@@ -668,10 +699,14 @@ typedef struct _MPT_ADAPTER
|
||||
|
||||
struct work_struct fc_setup_reset_work;
|
||||
struct list_head fc_rports;
|
||||
struct work_struct fc_lsc_work;
|
||||
u8 fc_link_speed[2];
|
||||
spinlock_t fc_rescan_work_lock;
|
||||
struct work_struct fc_rescan_work;
|
||||
char fc_rescan_work_q_name[KOBJ_NAME_LEN];
|
||||
struct workqueue_struct *fc_rescan_work_q;
|
||||
struct scsi_cmnd **ScsiLookup;
|
||||
spinlock_t scsi_lookup_lock;
|
||||
} MPT_ADAPTER;
|
||||
|
||||
/*
|
||||
@@ -785,7 +820,6 @@ typedef struct _MPT_SCSI_HOST {
|
||||
MPT_ADAPTER *ioc;
|
||||
int port;
|
||||
u32 pad0;
|
||||
struct scsi_cmnd **ScsiLookup;
|
||||
MPT_LOCAL_REPLY *pLocal; /* used for internal commands */
|
||||
struct timer_list timer;
|
||||
/* Pool of memory for holding SCpnts before doing
|
||||
@@ -853,20 +887,21 @@ extern void mpt_detach(struct pci_dev *pdev);
|
||||
extern int mpt_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
extern int mpt_resume(struct pci_dev *pdev);
|
||||
#endif
|
||||
extern int mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass);
|
||||
extern void mpt_deregister(int cb_idx);
|
||||
extern int mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc);
|
||||
extern void mpt_event_deregister(int cb_idx);
|
||||
extern int mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func);
|
||||
extern void mpt_reset_deregister(int cb_idx);
|
||||
extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx);
|
||||
extern void mpt_device_driver_deregister(int cb_idx);
|
||||
extern MPT_FRAME_HDR *mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc);
|
||||
extern u8 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass);
|
||||
extern void mpt_deregister(u8 cb_idx);
|
||||
extern int mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc);
|
||||
extern void mpt_event_deregister(u8 cb_idx);
|
||||
extern int mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func);
|
||||
extern void mpt_reset_deregister(u8 cb_idx);
|
||||
extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx);
|
||||
extern void mpt_device_driver_deregister(u8 cb_idx);
|
||||
extern MPT_FRAME_HDR *mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc);
|
||||
extern void mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
|
||||
extern void mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
|
||||
extern void mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
|
||||
extern void mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
|
||||
extern void mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr);
|
||||
|
||||
extern int mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);
|
||||
extern int mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);
|
||||
extern int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp);
|
||||
extern u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked);
|
||||
extern void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan);
|
||||
@@ -884,9 +919,6 @@ extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhys
|
||||
extern struct list_head ioc_list;
|
||||
extern struct proc_dir_entry *mpt_proc_root_dir;
|
||||
|
||||
extern int mpt_lan_index; /* needed by mptlan.c */
|
||||
extern int mpt_stm_index; /* needed by mptstm.c */
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
#endif /* } __KERNEL__ */
|
||||
|
||||
|
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptctl.c
|
||||
* mpt Ioctl driver.
|
||||
* For use with LSI Logic PCI chip/adapters
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI PCI chip/adapters
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -66,8 +66,8 @@
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_tcq.h>
|
||||
|
||||
#define COPYRIGHT "Copyright (c) 1999-2007 LSI Logic Corporation"
|
||||
#define MODULEAUTHOR "LSI Logic Corporation"
|
||||
#define COPYRIGHT "Copyright (c) 1999-2007 LSI Corporation"
|
||||
#define MODULEAUTHOR "LSI Corporation"
|
||||
#include "mptbase.h"
|
||||
#include "mptctl.h"
|
||||
|
||||
@@ -83,7 +83,7 @@ MODULE_VERSION(my_VERSION);
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
||||
static int mptctl_id = -1;
|
||||
static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
|
||||
static DECLARE_WAIT_QUEUE_HEAD ( mptctl_wait );
|
||||
|
||||
@@ -181,7 +181,6 @@ static inline int
|
||||
mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
|
||||
{
|
||||
int rc = 0;
|
||||
// dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock));
|
||||
|
||||
if (nonblock) {
|
||||
if (!mutex_trylock(&ioc->ioctl->ioctl_mutex))
|
||||
@@ -190,7 +189,6 @@ mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
|
||||
if (mutex_lock_interruptible(&ioc->ioctl->ioctl_mutex))
|
||||
rc = -ERESTARTSYS;
|
||||
}
|
||||
// dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down return %d\n", rc));
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -342,7 +340,7 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
|
||||
SCSITaskMgmt_t *pScsiTm;
|
||||
MPT_SCSI_HOST *hd;
|
||||
int ii;
|
||||
int retval;
|
||||
int retval=0;
|
||||
|
||||
|
||||
ioctl->reset &= ~MPTCTL_RESET_OK;
|
||||
@@ -350,7 +348,7 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
|
||||
if (ioctl->ioc->sh == NULL)
|
||||
return -EPERM;
|
||||
|
||||
hd = (MPT_SCSI_HOST *) ioctl->ioc->sh->hostdata;
|
||||
hd = shost_priv(ioctl->ioc->sh);
|
||||
if (hd == NULL)
|
||||
return -EPERM;
|
||||
|
||||
@@ -395,12 +393,19 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
|
||||
DBG_DUMP_TM_REQUEST_FRAME(ioctl->ioc, (u32 *)mf);
|
||||
|
||||
ioctl->wait_done=0;
|
||||
if ((retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc,
|
||||
sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
|
||||
dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
|
||||
" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
|
||||
hd->ioc, mf));
|
||||
goto mptctl_bus_reset_done;
|
||||
|
||||
if ((ioctl->ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
|
||||
(ioctl->ioc->facts.MsgVersion >= MPI_VERSION_01_05))
|
||||
mpt_put_msg_frame_hi_pri(mptctl_id, ioctl->ioc, mf);
|
||||
else {
|
||||
retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc,
|
||||
sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP);
|
||||
if (retval != 0) {
|
||||
dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
|
||||
" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
|
||||
hd->ioc, mf));
|
||||
goto mptctl_bus_reset_done;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now wait for the command to complete */
|
||||
@@ -444,7 +449,7 @@ mptctl_free_tm_flags(MPT_ADAPTER *ioc)
|
||||
MPT_SCSI_HOST * hd;
|
||||
unsigned long flags;
|
||||
|
||||
hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
|
||||
hd = shost_priv(ioc->sh);
|
||||
if (hd == NULL)
|
||||
return;
|
||||
|
||||
@@ -468,7 +473,7 @@ static int
|
||||
mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
{
|
||||
MPT_IOCTL *ioctl = ioc->ioctl;
|
||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": IOC %s_reset routed to IOCTL driver!\n",ioc->name,
|
||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOC %s_reset routed to IOCTL driver!\n", ioc->name,
|
||||
reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
|
||||
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
|
||||
|
||||
@@ -574,7 +579,7 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
MPT_ADAPTER *iocp = NULL;
|
||||
|
||||
if (copy_from_user(&khdr, uhdr, sizeof(khdr))) {
|
||||
printk(KERN_ERR "%s::mptctl_ioctl() @%d - "
|
||||
printk(KERN_ERR MYNAM "%s::mptctl_ioctl() @%d - "
|
||||
"Unable to copy mpt_ioctl_header data @ %p\n",
|
||||
__FILE__, __LINE__, uhdr);
|
||||
return -EFAULT;
|
||||
@@ -587,13 +592,13 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
iocnumX = khdr.iocnum & 0xFF;
|
||||
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
|
||||
(iocp == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnumX);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!iocp->active) {
|
||||
printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - Controller disabled.\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - Controller disabled.\n",
|
||||
__FILE__, __LINE__);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -660,14 +665,14 @@ static int mptctl_do_reset(unsigned long arg)
|
||||
MPT_ADAPTER *iocp;
|
||||
|
||||
if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_reset - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_do_reset - "
|
||||
"Unable to copy mpt_ioctl_diag_reset struct @ %p\n",
|
||||
__FILE__, __LINE__, urinfo);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) {
|
||||
printk(KERN_DEBUG "%s@%d::mptctl_do_reset - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s@%d::mptctl_do_reset - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, krinfo.hdr.iocnum);
|
||||
return -ENODEV; /* (-6) No such device or address */
|
||||
}
|
||||
@@ -676,8 +681,8 @@ static int mptctl_do_reset(unsigned long arg)
|
||||
iocp->name));
|
||||
|
||||
if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) {
|
||||
printk (KERN_ERR "%s@%d::mptctl_do_reset - reset failed.\n",
|
||||
__FILE__, __LINE__);
|
||||
printk (MYIOC_s_ERR_FMT "%s@%d::mptctl_do_reset - reset failed.\n",
|
||||
iocp->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -708,7 +713,7 @@ mptctl_fw_download(unsigned long arg)
|
||||
struct mpt_fw_xfer kfwdl;
|
||||
|
||||
if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) {
|
||||
printk(KERN_ERR "%s@%d::_ioctl_fwdl - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::_ioctl_fwdl - "
|
||||
"Unable to copy mpt_fw_xfer struct @ %p\n",
|
||||
__FILE__, __LINE__, ufwdl);
|
||||
return -EFAULT;
|
||||
@@ -756,7 +761,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
|
||||
pFWDownloadReply_t ReplyMsg = NULL;
|
||||
|
||||
if (mpt_verify_adapter(ioc, &iocp) < 0) {
|
||||
printk(KERN_DEBUG "ioctl_fwdl - ioc%d not found!\n", ioc);
|
||||
printk(KERN_DEBUG MYNAM "ioctl_fwdl - ioc%d not found!\n",
|
||||
ioc);
|
||||
return -ENODEV; /* (-6) No such device or address */
|
||||
} else {
|
||||
|
||||
@@ -868,9 +874,9 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
|
||||
mpt_add_sge(sgOut, sgIn->FlagsLength, sgIn->Address);
|
||||
n++;
|
||||
if (copy_from_user(bl->kptr, ufwbuf+fw_bytes_copied, bl->len)) {
|
||||
printk(KERN_ERR "%s@%d::_ioctl_fwdl - "
|
||||
"Unable to copy f/w buffer hunk#%d @ %p\n",
|
||||
__FILE__, __LINE__, n, ufwbuf);
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::_ioctl_fwdl - "
|
||||
"Unable to copy f/w buffer hunk#%d @ %p\n",
|
||||
iocp->name, __FILE__, __LINE__, n, ufwbuf);
|
||||
goto fwdl_out;
|
||||
}
|
||||
fw_bytes_copied += bl->len;
|
||||
@@ -906,21 +912,22 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
|
||||
ReplyMsg = (pFWDownloadReply_t)iocp->ioctl->ReplyFrame;
|
||||
iocstat = le16_to_cpu(ReplyMsg->IOCStatus) & MPI_IOCSTATUS_MASK;
|
||||
if (iocstat == MPI_IOCSTATUS_SUCCESS) {
|
||||
printk(KERN_INFO MYNAM ": F/W update successfully sent to %s!\n", iocp->name);
|
||||
printk(MYIOC_s_INFO_FMT "F/W update successfull!\n", iocp->name);
|
||||
return 0;
|
||||
} else if (iocstat == MPI_IOCSTATUS_INVALID_FUNCTION) {
|
||||
printk(KERN_WARNING MYNAM ": ?Hmmm... %s says it doesn't support F/W download!?!\n",
|
||||
iocp->name);
|
||||
printk(KERN_WARNING MYNAM ": (time to go bang on somebodies door)\n");
|
||||
printk(MYIOC_s_WARN_FMT "Hmmm... F/W download not supported!?!\n",
|
||||
iocp->name);
|
||||
printk(MYIOC_s_WARN_FMT "(time to go bang on somebodies door)\n",
|
||||
iocp->name);
|
||||
return -EBADRQC;
|
||||
} else if (iocstat == MPI_IOCSTATUS_BUSY) {
|
||||
printk(KERN_WARNING MYNAM ": Warning! %s says: IOC_BUSY!\n", iocp->name);
|
||||
printk(KERN_WARNING MYNAM ": (try again later?)\n");
|
||||
printk(MYIOC_s_WARN_FMT "IOC_BUSY!\n", iocp->name);
|
||||
printk(MYIOC_s_WARN_FMT "(try again later?)\n", iocp->name);
|
||||
return -EBUSY;
|
||||
} else {
|
||||
printk(KERN_WARNING MYNAM "::ioctl_fwdl() ERROR! %s returned [bad] status = %04xh\n",
|
||||
iocp->name, iocstat);
|
||||
printk(KERN_WARNING MYNAM ": (bad VooDoo)\n");
|
||||
printk(MYIOC_s_WARN_FMT "ioctl_fwdl() returned [bad] status = %04xh\n",
|
||||
iocp->name, iocstat);
|
||||
printk(MYIOC_s_WARN_FMT "(bad VooDoo)\n", iocp->name);
|
||||
return -ENOMSG;
|
||||
}
|
||||
return 0;
|
||||
@@ -970,10 +977,9 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
|
||||
* structures for the SG elements.
|
||||
*/
|
||||
i = MAX_SGL_BYTES / 8;
|
||||
buflist = kmalloc(i, GFP_USER);
|
||||
if (buflist == NULL)
|
||||
buflist = kzalloc(i, GFP_USER);
|
||||
if (!buflist)
|
||||
return NULL;
|
||||
memset(buflist, 0, i);
|
||||
buflist_ent = 0;
|
||||
|
||||
/* Allocate a single block of memory to store the sg elements and
|
||||
@@ -1008,10 +1014,10 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
|
||||
if (buflist[buflist_ent].kptr == NULL) {
|
||||
alloc_sz = alloc_sz / 2;
|
||||
if (alloc_sz == 0) {
|
||||
printk(KERN_WARNING MYNAM "-SG: No can do - "
|
||||
"not enough memory! :-(\n");
|
||||
printk(KERN_WARNING MYNAM "-SG: (freeing %d frags)\n",
|
||||
numfrags);
|
||||
printk(MYIOC_s_WARN_FMT "-SG: No can do - "
|
||||
"not enough memory! :-(\n", ioc->name);
|
||||
printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
|
||||
ioc->name, numfrags);
|
||||
goto free_and_fail;
|
||||
}
|
||||
continue;
|
||||
@@ -1034,18 +1040,19 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
|
||||
|
||||
/* Need to chain? */
|
||||
if (fragcnt == sg_spill) {
|
||||
printk(KERN_WARNING MYNAM "-SG: No can do - " "Chain required! :-(\n");
|
||||
printk(KERN_WARNING MYNAM "(freeing %d frags)\n", numfrags);
|
||||
printk(MYIOC_s_WARN_FMT
|
||||
"-SG: No can do - " "Chain required! :-(\n", ioc->name);
|
||||
printk(MYIOC_s_WARN_FMT "(freeing %d frags)\n", ioc->name, numfrags);
|
||||
goto free_and_fail;
|
||||
}
|
||||
|
||||
/* overflow check... */
|
||||
if (numfrags*8 > MAX_SGL_BYTES){
|
||||
/* GRRRRR... */
|
||||
printk(KERN_WARNING MYNAM "-SG: No can do - "
|
||||
"too many SG frags! :-(\n");
|
||||
printk(KERN_WARNING MYNAM "-SG: (freeing %d frags)\n",
|
||||
numfrags);
|
||||
printk(MYIOC_s_WARN_FMT "-SG: No can do - "
|
||||
"too many SG frags! :-(\n", ioc->name);
|
||||
printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
|
||||
ioc->name, numfrags);
|
||||
goto free_and_fail;
|
||||
}
|
||||
}
|
||||
@@ -1066,8 +1073,6 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
|
||||
|
||||
free_and_fail:
|
||||
if (sglbuf != NULL) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < numfrags; i++) {
|
||||
dma_addr_t dma_addr;
|
||||
u8 *kptr;
|
||||
@@ -1170,7 +1175,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
int cim_rev;
|
||||
u8 revision;
|
||||
struct scsi_device *sdev;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
|
||||
/* Add of PCI INFO results in unaligned access for
|
||||
* IA64 and Sparc. Reset long to int. Return no PCI
|
||||
@@ -1189,13 +1194,13 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
|
||||
karg = kmalloc(data_size, GFP_KERNEL);
|
||||
if (karg == NULL) {
|
||||
printk(KERN_ERR "%s::mpt_ioctl_iocinfo() @%d - no memory available!\n",
|
||||
printk(KERN_ERR MYNAM "%s::mpt_ioctl_iocinfo() @%d - no memory available!\n",
|
||||
__FILE__, __LINE__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (copy_from_user(karg, uarg, data_size)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_getiocinfo - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_getiocinfo - "
|
||||
"Unable to read in mpt_ioctl_iocinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
kfree(karg);
|
||||
@@ -1204,7 +1209,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
kfree(karg);
|
||||
return -ENODEV;
|
||||
@@ -1212,9 +1217,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
|
||||
/* Verify the data transfer size is correct. */
|
||||
if (karg->hdr.maxDataSize != data_size) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_getiocinfo - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
|
||||
"Structure size mismatch. Command not completed.\n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
kfree(karg);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1265,8 +1270,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
karg->numDevices = 0;
|
||||
if (ioc->sh) {
|
||||
shost_for_each_device(sdev, ioc->sh) {
|
||||
vdev = sdev->hostdata;
|
||||
if (vdev->vtarget->tflags &
|
||||
vdevice = sdev->hostdata;
|
||||
if (vdevice->vtarget->tflags &
|
||||
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
||||
continue;
|
||||
karg->numDevices++;
|
||||
@@ -1290,9 +1295,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||
/* Copy the data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, karg, data_size)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_getiocinfo - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
|
||||
"Unable to write out mpt_ioctl_iocinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
kfree(karg);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1317,7 +1322,7 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
struct mpt_ioctl_targetinfo __user *uarg = (void __user *) arg;
|
||||
struct mpt_ioctl_targetinfo karg;
|
||||
MPT_ADAPTER *ioc;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
char *pmem;
|
||||
int *pdata;
|
||||
int iocnum;
|
||||
@@ -1329,7 +1334,7 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
struct scsi_device *sdev;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_gettargetinfo - "
|
||||
"Unable to read in mpt_ioctl_targetinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1337,7 +1342,7 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1353,8 +1358,8 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
port = karg.hdr.port;
|
||||
|
||||
if (maxWordsLeft <= 0) {
|
||||
printk(KERN_ERR "%s::mptctl_gettargetinfo() @%d - no memory available!\n",
|
||||
__FILE__, __LINE__);
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -1372,13 +1377,12 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
* 15- 8: Bus Number
|
||||
* 7- 0: Target ID
|
||||
*/
|
||||
pmem = kmalloc(numBytes, GFP_KERNEL);
|
||||
if (pmem == NULL) {
|
||||
printk(KERN_ERR "%s::mptctl_gettargetinfo() @%d - no memory available!\n",
|
||||
__FILE__, __LINE__);
|
||||
pmem = kzalloc(numBytes, GFP_KERNEL);
|
||||
if (!pmem) {
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(pmem, 0, numBytes);
|
||||
pdata = (int *) pmem;
|
||||
|
||||
/* Get number of devices
|
||||
@@ -1387,13 +1391,13 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
shost_for_each_device(sdev, ioc->sh) {
|
||||
if (!maxWordsLeft)
|
||||
continue;
|
||||
vdev = sdev->hostdata;
|
||||
if (vdev->vtarget->tflags &
|
||||
vdevice = sdev->hostdata;
|
||||
if (vdevice->vtarget->tflags &
|
||||
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
||||
continue;
|
||||
lun = (vdev->vtarget->raidVolume) ? 0x80 : vdev->lun;
|
||||
*pdata = (((u8)lun << 16) + (vdev->vtarget->channel << 8) +
|
||||
(vdev->vtarget->id ));
|
||||
lun = (vdevice->vtarget->raidVolume) ? 0x80 : vdevice->lun;
|
||||
*pdata = (((u8)lun << 16) + (vdevice->vtarget->channel << 8) +
|
||||
(vdevice->vtarget->id ));
|
||||
pdata++;
|
||||
numDevices++;
|
||||
--maxWordsLeft;
|
||||
@@ -1405,9 +1409,9 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, &karg,
|
||||
sizeof(struct mpt_ioctl_targetinfo))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
|
||||
"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
kfree(pmem);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1415,9 +1419,9 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||
/* Copy the remaining data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user(uarg->targetInfo, pmem, numBytes)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
|
||||
"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, pdata);
|
||||
ioc->name, __FILE__, __LINE__, pdata);
|
||||
kfree(pmem);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1444,7 +1448,7 @@ mptctl_readtest (unsigned long arg)
|
||||
int iocnum;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_readtest - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_readtest - "
|
||||
"Unable to read in mpt_ioctl_test struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1452,7 +1456,7 @@ mptctl_readtest (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_readtest() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_readtest() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1476,9 +1480,9 @@ mptctl_readtest (unsigned long arg)
|
||||
/* Copy the data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_test))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_readtest - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_readtest - "
|
||||
"Unable to write out mpt_ioctl_test struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -1505,7 +1509,7 @@ mptctl_eventquery (unsigned long arg)
|
||||
int iocnum;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_eventquery - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_eventquery - "
|
||||
"Unable to read in mpt_ioctl_eventquery struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1513,7 +1517,7 @@ mptctl_eventquery (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1526,9 +1530,9 @@ mptctl_eventquery (unsigned long arg)
|
||||
/* Copy the data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_eventquery))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_eventquery - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventquery - "
|
||||
"Unable to write out mpt_ioctl_eventquery struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
@@ -1544,7 +1548,7 @@ mptctl_eventenable (unsigned long arg)
|
||||
int iocnum;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_eventenable - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_eventenable - "
|
||||
"Unable to read in mpt_ioctl_eventenable struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1552,7 +1556,7 @@ mptctl_eventenable (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1563,12 +1567,13 @@ mptctl_eventenable (unsigned long arg)
|
||||
/* Have not yet allocated memory - do so now.
|
||||
*/
|
||||
int sz = MPTCTL_EVENT_LOG_SIZE * sizeof(MPT_IOCTL_EVENTS);
|
||||
ioc->events = kmalloc(sz, GFP_KERNEL);
|
||||
if (ioc->events == NULL) {
|
||||
printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n");
|
||||
ioc->events = kzalloc(sz, GFP_KERNEL);
|
||||
if (!ioc->events) {
|
||||
printk(MYIOC_s_ERR_FMT
|
||||
": ERROR - Insufficient memory to add adapter!\n",
|
||||
ioc->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(ioc->events, 0, sz);
|
||||
ioc->alloc_total += sz;
|
||||
|
||||
ioc->eventContext = 0;
|
||||
@@ -1592,7 +1597,7 @@ mptctl_eventreport (unsigned long arg)
|
||||
int numBytes, maxEvents, max;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_eventreport - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_eventreport - "
|
||||
"Unable to read in mpt_ioctl_eventreport struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1600,7 +1605,7 @@ mptctl_eventreport (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1626,9 +1631,9 @@ mptctl_eventreport (unsigned long arg)
|
||||
*/
|
||||
numBytes = max * sizeof(MPT_IOCTL_EVENTS);
|
||||
if (copy_to_user(uarg->eventData, ioc->events, numBytes)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_eventreport - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventreport - "
|
||||
"Unable to write out mpt_ioctl_eventreport struct @ %p\n",
|
||||
__FILE__, __LINE__, ioc->events);
|
||||
ioc->name, __FILE__, __LINE__, ioc->events);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -1646,7 +1651,7 @@ mptctl_replace_fw (unsigned long arg)
|
||||
int newFwSize;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_replace_fw - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_replace_fw - "
|
||||
"Unable to read in mpt_ioctl_replace_fw struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1654,7 +1659,7 @@ mptctl_replace_fw (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1684,9 +1689,9 @@ mptctl_replace_fw (unsigned long arg)
|
||||
/* Copy the data from user memory to kernel space
|
||||
*/
|
||||
if (copy_from_user(ioc->cached_fw, uarg->newImage, newFwSize)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_replace_fw - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_replace_fw - "
|
||||
"Unable to read in mpt_ioctl_replace_fw image "
|
||||
"@ %p\n", __FILE__, __LINE__, uarg);
|
||||
"@ %p\n", ioc->name, __FILE__, __LINE__, uarg);
|
||||
mpt_free_fw_memory(ioc);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1720,7 +1725,7 @@ mptctl_mpt_command (unsigned long arg)
|
||||
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_mpt_command - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_mpt_command - "
|
||||
"Unable to read in mpt_ioctl_command struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -1728,7 +1733,7 @@ mptctl_mpt_command (unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1769,21 +1774,24 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
ulong timeout;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
/* bufIn and bufOut are used for user to kernel space transfers
|
||||
*/
|
||||
bufIn.kptr = bufOut.kptr = NULL;
|
||||
bufIn.len = bufOut.len = 0;
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (!ioc->ioctl) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "
|
||||
"No memory available during driver init.\n",
|
||||
__FILE__, __LINE__);
|
||||
return -ENOMEM;
|
||||
} else if (ioc->ioctl->status & MPT_IOCTL_STATUS_DID_IOCRESET) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "
|
||||
"Busy with IOC Reset \n", __FILE__, __LINE__);
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -1797,9 +1805,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
sz += sizeof(dma_addr_t) + sizeof(u32);
|
||||
|
||||
if (sz > ioc->req_sz) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Request frame too large (%d) maximum (%d)\n",
|
||||
__FILE__, __LINE__, sz, ioc->req_sz);
|
||||
ioc->name, __FILE__, __LINE__, sz, ioc->req_sz);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -1817,9 +1825,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
* Request frame in user space
|
||||
*/
|
||||
if (copy_from_user(mf, mfPtr, karg.dataSgeOffset * 4)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Unable to read MF from mpt_ioctl_command struct @ %p\n",
|
||||
__FILE__, __LINE__, mfPtr);
|
||||
ioc->name, __FILE__, __LINE__, mfPtr);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -1870,17 +1878,17 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
|
||||
id = (ioc->devices_per_bus == 0) ? 256 : ioc->devices_per_bus;
|
||||
if (pScsiReq->TargetID > id) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Target ID out of bounds. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -ENODEV;
|
||||
goto done_free_mem;
|
||||
}
|
||||
|
||||
if (pScsiReq->Bus >= ioc->number_of_buses) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Target Bus out of bounds. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -ENODEV;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -1932,9 +1940,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
ioc->ioctl->id = pScsiReq->TargetID;
|
||||
|
||||
} else {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"SCSI driver is not loaded. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -1951,9 +1959,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
|
||||
case MPI_FUNCTION_SATA_PASSTHROUGH:
|
||||
if (!ioc->sh) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"SCSI driver is not loaded. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2010,9 +2018,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
ioc->ioctl->reset = MPTCTL_RESET_OK;
|
||||
ioc->ioctl->id = pScsiReq->TargetID;
|
||||
} else {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"SCSI driver is not loaded. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2021,10 +2029,10 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
case MPI_FUNCTION_SCSI_TASK_MGMT:
|
||||
{
|
||||
MPT_SCSI_HOST *hd = NULL;
|
||||
if ((ioc->sh == NULL) || ((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
if ((ioc->sh == NULL) || ((hd = shost_priv(ioc->sh)) == NULL)) {
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"SCSI driver not loaded or SCSI host not found. \n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
} else if (mptctl_set_tm_flags(hd) != 0) {
|
||||
@@ -2055,9 +2063,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
(pInit->ReplyFrameSize != cpu_to_le16(ioc->reply_sz)) ||
|
||||
(pInit->HostMfaHighAddr != high_addr) ||
|
||||
(pInit->SenseBufferHighAddr != sense_high)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"IOC_INIT issued with 1 or more incorrect parameters. Rejected.\n",
|
||||
__FILE__, __LINE__);
|
||||
ioc->name, __FILE__, __LINE__);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2088,9 +2096,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
MPI_FUNCTION_LAN_RESET
|
||||
*/
|
||||
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Illegal request (function 0x%x) \n",
|
||||
__FILE__, __LINE__, hdr->Function);
|
||||
ioc->name, __FILE__, __LINE__, hdr->Function);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2103,11 +2111,6 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
psge = (char *) (((int *) mf) + karg.dataSgeOffset);
|
||||
flagsLength = 0;
|
||||
|
||||
/* bufIn and bufOut are used for user to kernel space transfers
|
||||
*/
|
||||
bufIn.kptr = bufOut.kptr = NULL;
|
||||
bufIn.len = bufOut.len = 0;
|
||||
|
||||
if (karg.dataOutSize > 0)
|
||||
sgSize ++;
|
||||
|
||||
@@ -2147,11 +2150,11 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
if (copy_from_user(bufOut.kptr,
|
||||
karg.dataOutBufPtr,
|
||||
bufOut.len)) {
|
||||
printk(KERN_ERR
|
||||
printk(MYIOC_s_ERR_FMT
|
||||
"%s@%d::mptctl_do_mpt_command - Unable "
|
||||
"to read user data "
|
||||
"struct @ %p\n",
|
||||
__FILE__, __LINE__,karg.dataOutBufPtr);
|
||||
ioc->name, __FILE__, __LINE__,karg.dataOutBufPtr);
|
||||
rc = -EFAULT;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2187,15 +2190,20 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
|
||||
DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
|
||||
|
||||
if (mpt_send_handshake_request(mptctl_id, ioc,
|
||||
sizeof(SCSITaskMgmt_t), (u32*)mf,
|
||||
CAN_SLEEP) != 0) {
|
||||
dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
|
||||
" (ioc %p, mf %p) \n", ioc->name,
|
||||
ioc, mf));
|
||||
mptctl_free_tm_flags(ioc);
|
||||
rc = -ENODATA;
|
||||
goto done_free_mem;
|
||||
if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
|
||||
(ioc->facts.MsgVersion >= MPI_VERSION_01_05))
|
||||
mpt_put_msg_frame_hi_pri(mptctl_id, ioc, mf);
|
||||
else {
|
||||
rc =mpt_send_handshake_request(mptctl_id, ioc,
|
||||
sizeof(SCSITaskMgmt_t), (u32*)mf, CAN_SLEEP);
|
||||
if (rc != 0) {
|
||||
dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
|
||||
"_send_handshake FAILED! (ioc %p, mf %p)\n",
|
||||
ioc->name, ioc, mf));
|
||||
mptctl_free_tm_flags(ioc);
|
||||
rc = -ENODATA;
|
||||
goto done_free_mem;
|
||||
}
|
||||
}
|
||||
|
||||
} else
|
||||
@@ -2233,10 +2241,10 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
if (sz > 0) {
|
||||
if (copy_to_user(karg.replyFrameBufPtr,
|
||||
&ioc->ioctl->ReplyFrame, sz)){
|
||||
printk(KERN_ERR
|
||||
printk(MYIOC_s_ERR_FMT
|
||||
"%s@%d::mptctl_do_mpt_command - "
|
||||
"Unable to write out reply frame %p\n",
|
||||
__FILE__, __LINE__, karg.replyFrameBufPtr);
|
||||
ioc->name, __FILE__, __LINE__, karg.replyFrameBufPtr);
|
||||
rc = -ENODATA;
|
||||
goto done_free_mem;
|
||||
}
|
||||
@@ -2249,9 +2257,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);
|
||||
if (sz > 0) {
|
||||
if (copy_to_user(karg.senseDataPtr, ioc->ioctl->sense, sz)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Unable to write sense data to user %p\n",
|
||||
__FILE__, __LINE__,
|
||||
ioc->name, __FILE__, __LINE__,
|
||||
karg.senseDataPtr);
|
||||
rc = -ENODATA;
|
||||
goto done_free_mem;
|
||||
@@ -2267,9 +2275,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||
|
||||
if (copy_to_user(karg.dataInBufPtr,
|
||||
bufIn.kptr, karg.dataInSize)) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
|
||||
"Unable to write data to user %p\n",
|
||||
__FILE__, __LINE__,
|
||||
ioc->name, __FILE__, __LINE__,
|
||||
karg.dataInBufPtr);
|
||||
rc = -ENODATA;
|
||||
}
|
||||
@@ -2340,7 +2348,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
||||
return -EFAULT;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(hp_host_info_t))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_hp_host_info - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_host_info - "
|
||||
"Unable to read in hp_host_info struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -2348,7 +2356,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -2456,7 +2464,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
||||
karg.soft_resets = 0;
|
||||
karg.timeouts = 0;
|
||||
if (ioc->sh != NULL) {
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
|
||||
if (hd && (cim_rev == 1)) {
|
||||
karg.hard_resets = hd->hard_resets;
|
||||
@@ -2529,9 +2537,9 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
||||
/* Copy the data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, &karg, sizeof(hp_host_info_t))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_hpgethostinfo - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hpgethostinfo - "
|
||||
"Unable to write out hp_host_info @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -2567,7 +2575,7 @@ mptctl_hp_targetinfo(unsigned long arg)
|
||||
int tmp, np, rc = 0;
|
||||
|
||||
if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_hp_targetinfo - "
|
||||
printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_targetinfo - "
|
||||
"Unable to read in hp_host_targetinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
@@ -2575,11 +2583,11 @@ mptctl_hp_targetinfo(unsigned long arg)
|
||||
|
||||
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
|
||||
(ioc == NULL)) {
|
||||
printk(KERN_DEBUG "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
|
||||
printk(KERN_DEBUG MYNAM "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
|
||||
__FILE__, __LINE__, iocnum);
|
||||
return -ENODEV;
|
||||
}
|
||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_targetinfo called.\n",
|
||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
|
||||
ioc->name));
|
||||
|
||||
/* There is nothing to do for FCP parts.
|
||||
@@ -2673,16 +2681,16 @@ mptctl_hp_targetinfo(unsigned long arg)
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *) pg3_alloc, page_dma);
|
||||
}
|
||||
}
|
||||
hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
|
||||
hd = shost_priv(ioc->sh);
|
||||
if (hd != NULL)
|
||||
karg.select_timeouts = hd->sel_timeout[karg.hdr.id];
|
||||
|
||||
/* Copy the data from kernel memory to user memory
|
||||
*/
|
||||
if (copy_to_user((char __user *)arg, &karg, sizeof(hp_target_info_t))) {
|
||||
printk(KERN_ERR "%s@%d::mptctl_hp_target_info - "
|
||||
printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hp_target_info - "
|
||||
"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
|
||||
__FILE__, __LINE__, uarg);
|
||||
ioc->name, __FILE__, __LINE__, uarg);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -2732,7 +2740,7 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
|
||||
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
|
||||
(iocp == NULL)) {
|
||||
printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
|
||||
__LINE__, iocnumX);
|
||||
__LINE__, iocnumX);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -2772,7 +2780,7 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
|
||||
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
|
||||
(iocp == NULL)) {
|
||||
printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
|
||||
__LINE__, iocnumX);
|
||||
__LINE__, iocnumX);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -2853,31 +2861,22 @@ static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long a
|
||||
static int
|
||||
mptctl_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
int err;
|
||||
int sz;
|
||||
u8 *mem;
|
||||
MPT_IOCTL *mem;
|
||||
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
||||
|
||||
/*
|
||||
* Allocate and inite a MPT_IOCTL structure
|
||||
*/
|
||||
sz = sizeof (MPT_IOCTL);
|
||||
mem = kmalloc(sz, GFP_KERNEL);
|
||||
if (mem == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto out_fail;
|
||||
mem = kzalloc(sizeof(MPT_IOCTL), GFP_KERNEL);
|
||||
if (!mem) {
|
||||
mptctl_remove(pdev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(mem, 0, sz);
|
||||
ioc->ioctl = (MPT_IOCTL *) mem;
|
||||
ioc->ioctl = mem;
|
||||
ioc->ioctl->ioc = ioc;
|
||||
mutex_init(&ioc->ioctl->ioctl_mutex);
|
||||
return 0;
|
||||
|
||||
out_fail:
|
||||
|
||||
mptctl_remove(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
@@ -2924,7 +2923,8 @@ static int __init mptctl_init(void)
|
||||
* Install our handler
|
||||
*/
|
||||
++where;
|
||||
if ((mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER)) < 0) {
|
||||
mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER);
|
||||
if (!mptctl_id || mptctl_id >= MPT_MAX_PROTOCOL_DRIVERS) {
|
||||
printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");
|
||||
misc_deregister(&mptctl_miscdev);
|
||||
err = -EBUSY;
|
||||
|
@@ -3,9 +3,9 @@
|
||||
* Fusion MPT misc device (ioctl) driver.
|
||||
* For use with PCI chip/adapter(s):
|
||||
* LSIFC9xx/LSI409xx Fibre Channel
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
|
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptfc.c
|
||||
* For use with LSI Logic PCI chip/adapter(s)
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI PCI chip/adapter(s)
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -90,9 +90,9 @@ static int max_lun = MPTFC_MAX_LUN;
|
||||
module_param(max_lun, int, 0);
|
||||
MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
|
||||
|
||||
static int mptfcDoneCtx = -1;
|
||||
static int mptfcTaskCtx = -1;
|
||||
static int mptfcInternalCtx = -1; /* Used only for internal commands */
|
||||
static u8 mptfcDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptfcTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptfcInternalCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
|
||||
static int mptfc_target_alloc(struct scsi_target *starget);
|
||||
static int mptfc_slave_alloc(struct scsi_device *sdev);
|
||||
@@ -194,37 +194,36 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
unsigned long flags;
|
||||
int ready;
|
||||
MPT_ADAPTER *ioc;
|
||||
|
||||
hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
|
||||
hd = shost_priv(SCpnt->device->host);
|
||||
ioc = hd->ioc;
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"mptfc_block_error_handler.%d: %d:%d, port status is "
|
||||
"DID_IMM_RETRY, deferring %s recovery.\n",
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun,caller));
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun, caller));
|
||||
msleep(1000);
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) {
|
||||
dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s.%d: %d:%d, failing recovery, "
|
||||
"port state %d, vdev %p.\n", caller,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun,ready,
|
||||
"port state %d, vdevice %p.\n", caller,
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun, ready,
|
||||
SCpnt->device->hostdata));
|
||||
return FAILED;
|
||||
}
|
||||
dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s.%d: %d:%d, executing recovery.\n", caller,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun));
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun));
|
||||
return (*func)(SCpnt);
|
||||
}
|
||||
|
||||
@@ -470,7 +469,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
|
||||
/*
|
||||
* if already mapped, remap here. If not mapped,
|
||||
* target_alloc will allocate vtarget and map,
|
||||
* slave_alloc will fill in vdev from vtarget.
|
||||
* slave_alloc will fill in vdevice from vtarget.
|
||||
*/
|
||||
if (ri->starget) {
|
||||
vtarget = ri->starget->hostdata;
|
||||
@@ -602,10 +601,10 @@ mptfc_slave_alloc(struct scsi_device *sdev)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
VirtTarget *vtarget;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
struct scsi_target *starget;
|
||||
struct fc_rport *rport;
|
||||
|
||||
MPT_ADAPTER *ioc;
|
||||
|
||||
starget = scsi_target(sdev);
|
||||
rport = starget_to_rport(starget);
|
||||
@@ -613,31 +612,32 @@ mptfc_slave_alloc(struct scsi_device *sdev)
|
||||
if (!rport || fc_remote_port_chkready(rport))
|
||||
return -ENXIO;
|
||||
|
||||
hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
|
||||
hd = shost_priv(sdev->host);
|
||||
ioc = hd->ioc;
|
||||
|
||||
vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdev) {
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
|
||||
hd->ioc->name, sizeof(VirtDevice));
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
sdev->hostdata = vdev;
|
||||
sdev->hostdata = vdevice;
|
||||
vtarget = starget->hostdata;
|
||||
|
||||
if (vtarget->num_luns == 0) {
|
||||
vtarget->ioc_id = hd->ioc->id;
|
||||
vtarget->ioc_id = ioc->id;
|
||||
vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
|
||||
}
|
||||
|
||||
vdev->vtarget = vtarget;
|
||||
vdev->lun = sdev->lun;
|
||||
vdevice->vtarget = vtarget;
|
||||
vdevice->lun = sdev->lun;
|
||||
|
||||
vtarget->num_luns++;
|
||||
|
||||
|
||||
mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget);
|
||||
mptfc_dump_lun_info(ioc, rport, sdev, vtarget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -648,9 +648,9 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
struct mptfc_rport_info *ri;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device));
|
||||
int err;
|
||||
VirtDevice *vdev = SCpnt->device->hostdata;
|
||||
VirtDevice *vdevice = SCpnt->device->hostdata;
|
||||
|
||||
if (!vdev || !vdev->vtarget) {
|
||||
if (!vdevice || !vdevice->vtarget) {
|
||||
SCpnt->result = DID_NO_CONNECT << 16;
|
||||
done(SCpnt);
|
||||
return 0;
|
||||
@@ -674,6 +674,50 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
return mptscsih_qcmd(SCpnt,done);
|
||||
}
|
||||
|
||||
/*
|
||||
* mptfc_display_port_link_speed - displaying link speed
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @portnum: IOC Port number
|
||||
* @pp0dest: port page0 data payload
|
||||
*
|
||||
*/
|
||||
static void
|
||||
mptfc_display_port_link_speed(MPT_ADAPTER *ioc, int portnum, FCPortPage0_t *pp0dest)
|
||||
{
|
||||
u8 old_speed, new_speed, state;
|
||||
char *old, *new;
|
||||
|
||||
if (portnum >= 2)
|
||||
return;
|
||||
|
||||
old_speed = ioc->fc_link_speed[portnum];
|
||||
new_speed = pp0dest->CurrentSpeed;
|
||||
state = pp0dest->PortState;
|
||||
|
||||
if (state != MPI_FCPORTPAGE0_PORTSTATE_OFFLINE &&
|
||||
new_speed != MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN) {
|
||||
|
||||
old = old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" :
|
||||
old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" :
|
||||
old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" :
|
||||
"Unknown";
|
||||
new = new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" :
|
||||
new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" :
|
||||
new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" :
|
||||
"Unknown";
|
||||
if (old_speed == 0)
|
||||
printk(MYIOC_s_NOTE_FMT
|
||||
"FC Link Established, Speed = %s\n",
|
||||
ioc->name, new);
|
||||
else if (old_speed != new_speed)
|
||||
printk(MYIOC_s_WARN_FMT
|
||||
"FC Link Speed Change, Old Speed = %s, New Speed = %s\n",
|
||||
ioc->name, old, new);
|
||||
|
||||
ioc->fc_link_speed[portnum] = new_speed;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* mptfc_GetFcPortPage0 - Fetch FCPort config Page0.
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
@@ -773,6 +817,7 @@ mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
|
||||
" complete.\n",
|
||||
ioc->name);
|
||||
}
|
||||
mptfc_display_port_link_speed(ioc, portnum, pp0dest);
|
||||
}
|
||||
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma);
|
||||
@@ -1022,6 +1067,18 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum)
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_link_status_change(struct work_struct *work)
|
||||
{
|
||||
MPT_ADAPTER *ioc =
|
||||
container_of(work, MPT_ADAPTER, fc_rescan_work);
|
||||
int ii;
|
||||
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++)
|
||||
(void) mptfc_GetFcPortPage0(ioc, ii);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_setup_reset(struct work_struct *work)
|
||||
{
|
||||
@@ -1163,6 +1220,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
spin_lock_init(&ioc->fc_rescan_work_lock);
|
||||
INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices);
|
||||
INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset);
|
||||
INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change);
|
||||
|
||||
spin_lock_irqsave(&ioc->FreeQlock, flags);
|
||||
|
||||
@@ -1218,20 +1276,21 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
spin_unlock_irqrestore(&ioc->FreeQlock, flags);
|
||||
|
||||
hd = (MPT_SCSI_HOST *) sh->hostdata;
|
||||
hd = shost_priv(sh);
|
||||
hd->ioc = ioc;
|
||||
|
||||
/* SCSI needs scsi_cmnd lookup table!
|
||||
* (with size equal to req_depth*PtrSz!)
|
||||
*/
|
||||
hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!hd->ScsiLookup) {
|
||||
ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!ioc->ScsiLookup) {
|
||||
error = -ENOMEM;
|
||||
goto out_mptfc_probe;
|
||||
}
|
||||
spin_lock_init(&ioc->scsi_lookup_lock);
|
||||
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, hd->ScsiLookup));
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
@@ -1262,8 +1321,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
sh->transportt = mptfc_transport_template;
|
||||
error = scsi_add_host (sh, &ioc->pcidev->dev);
|
||||
if(error) {
|
||||
dprintk(ioc, printk(KERN_ERR MYNAM
|
||||
"scsi_add_host failed\n"));
|
||||
dprintk(ioc, printk(MYIOC_s_ERR_FMT
|
||||
"scsi_add_host failed\n", ioc->name));
|
||||
goto out_mptfc_probe;
|
||||
}
|
||||
|
||||
@@ -1325,7 +1384,7 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
ioc->name, event));
|
||||
|
||||
if (ioc->sh == NULL ||
|
||||
((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL))
|
||||
((hd = shost_priv(ioc->sh)) == NULL))
|
||||
return 1;
|
||||
|
||||
switch (event) {
|
||||
@@ -1337,6 +1396,14 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
break;
|
||||
case MPI_EVENT_LINK_STATUS_CHANGE:
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_lsc_work);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
break;
|
||||
default:
|
||||
rc = mptscsih_event_process(ioc,pEvReply);
|
||||
break;
|
||||
|
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptlan.c
|
||||
* IP Over Fibre Channel device driver.
|
||||
* For use with LSI Logic Fibre Channel PCI chip/adapters
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI Fibre Channel PCI chip/adapters
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation
|
||||
* Copyright (c) 2000-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -154,7 +154,7 @@ static unsigned short mpt_lan_type_trans(struct sk_buff *skb,
|
||||
/*
|
||||
* Fusion MPT LAN private data
|
||||
*/
|
||||
static int LanCtx = -1;
|
||||
static u8 LanCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
|
||||
static u32 max_buckets_out = 127;
|
||||
static u32 tx_max_out_p = 127 - 16;
|
||||
@@ -164,12 +164,6 @@ static struct NAA_Hosed *mpt_bad_naa = NULL;
|
||||
DEFINE_RWLOCK(bad_naa_lock);
|
||||
#endif
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* Fusion MPT LAN external data
|
||||
*/
|
||||
extern int mpt_lan_index;
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/**
|
||||
* lan_reply - Handle all data sent from the hardware.
|
||||
@@ -1230,6 +1224,8 @@ mpt_lan_post_receive_buckets(struct mpt_lan_priv *priv)
|
||||
}
|
||||
pRecvReq = (LANReceivePostRequest_t *) mf;
|
||||
|
||||
i = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
|
||||
mpt_dev->RequestNB[i] = 0;
|
||||
count = buckets;
|
||||
if (count > max)
|
||||
count = max;
|
||||
@@ -1351,10 +1347,11 @@ mpt_lan_post_receive_buckets_work(struct work_struct *work)
|
||||
static struct net_device *
|
||||
mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)
|
||||
{
|
||||
struct net_device *dev = alloc_fcdev(sizeof(struct mpt_lan_priv));
|
||||
struct mpt_lan_priv *priv = NULL;
|
||||
struct net_device *dev;
|
||||
struct mpt_lan_priv *priv;
|
||||
u8 HWaddr[FC_ALEN], *a;
|
||||
|
||||
dev = alloc_fcdev(sizeof(struct mpt_lan_priv));
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
@@ -1366,7 +1363,6 @@ mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)
|
||||
priv->mpt_dev = mpt_dev;
|
||||
priv->pnum = pnum;
|
||||
|
||||
memset(&priv->post_buckets_task, 0, sizeof(priv->post_buckets_task));
|
||||
INIT_DELAYED_WORK(&priv->post_buckets_task,
|
||||
mpt_lan_post_receive_buckets_work);
|
||||
priv->post_buckets_active = 0;
|
||||
@@ -1391,8 +1387,6 @@ mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)
|
||||
spin_lock_init(&priv->txfidx_lock);
|
||||
spin_lock_init(&priv->rxfidx_lock);
|
||||
|
||||
memset(&priv->stats, 0, sizeof(priv->stats));
|
||||
|
||||
/* Grab pre-fetched LANPage1 stuff. :-) */
|
||||
a = (u8 *) &mpt_dev->lan_cnfg_page1.HardwareAddressLow;
|
||||
|
||||
@@ -1508,9 +1502,6 @@ static int __init mpt_lan_init (void)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* Set the callback index to be used by driver core for turbo replies */
|
||||
mpt_lan_index = LanCtx;
|
||||
|
||||
dlprintk((KERN_INFO MYNAM ": assigned context of %d\n", LanCtx));
|
||||
|
||||
if (mpt_reset_register(LanCtx, mpt_lan_ioc_reset)) {
|
||||
@@ -1531,10 +1522,9 @@ static void __exit mpt_lan_exit(void)
|
||||
mpt_device_driver_deregister(MPTLAN_DRIVER);
|
||||
mpt_reset_deregister(LanCtx);
|
||||
|
||||
if (LanCtx >= 0) {
|
||||
if (LanCtx) {
|
||||
mpt_deregister(LanCtx);
|
||||
LanCtx = -1;
|
||||
mpt_lan_index = 0;
|
||||
LanCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptlan.h
|
||||
* IP Over Fibre Channel device driver.
|
||||
* For use with LSI Logic Fibre Channel PCI chip/adapters
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI Fibre Channel PCI chip/adapters
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 2000-2007 LSI Logic Corporation
|
||||
* Copyright (c) 2000-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -75,7 +75,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
/* Override mptbase.h by pre-defining these! */
|
||||
#define MODULEAUTHOR "LSI Logic Corporation"
|
||||
#define MODULEAUTHOR "LSI Corporation"
|
||||
|
||||
#include "mptbase.h"
|
||||
|
||||
|
@@ -1,11 +1,10 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptsas.c
|
||||
* For use with LSI Logic PCI chip/adapter(s)
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI PCI chip/adapter(s)
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
* Copyright (c) 2005-2007 Dell
|
||||
*/
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
@@ -61,6 +60,7 @@
|
||||
|
||||
#include "mptbase.h"
|
||||
#include "mptscsih.h"
|
||||
#include "mptsas.h"
|
||||
|
||||
|
||||
#define my_NAME "Fusion MPT SAS Host driver"
|
||||
@@ -89,134 +89,35 @@ static int max_lun = MPTSAS_MAX_LUN;
|
||||
module_param(max_lun, int, 0);
|
||||
MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
|
||||
|
||||
static int mptsasDoneCtx = -1;
|
||||
static int mptsasTaskCtx = -1;
|
||||
static int mptsasInternalCtx = -1; /* Used only for internal commands */
|
||||
static int mptsasMgmtCtx = -1;
|
||||
static u8 mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
|
||||
static u8 mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
|
||||
static void mptsas_hotplug_work(struct work_struct *work);
|
||||
|
||||
struct mptsas_target_reset_event {
|
||||
struct list_head list;
|
||||
EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data;
|
||||
u8 target_reset_issued;
|
||||
};
|
||||
|
||||
enum mptsas_hotplug_action {
|
||||
MPTSAS_ADD_DEVICE,
|
||||
MPTSAS_DEL_DEVICE,
|
||||
MPTSAS_ADD_RAID,
|
||||
MPTSAS_DEL_RAID,
|
||||
MPTSAS_ADD_INACTIVE_VOLUME,
|
||||
MPTSAS_IGNORE_EVENT,
|
||||
};
|
||||
|
||||
struct mptsas_hotplug_event {
|
||||
struct work_struct work;
|
||||
MPT_ADAPTER *ioc;
|
||||
enum mptsas_hotplug_action event_type;
|
||||
u64 sas_address;
|
||||
u8 channel;
|
||||
u8 id;
|
||||
u32 device_info;
|
||||
u16 handle;
|
||||
u16 parent_handle;
|
||||
u8 phy_id;
|
||||
u8 phys_disk_num_valid; /* hrc (hidden raid component) */
|
||||
u8 phys_disk_num; /* hrc - unique index*/
|
||||
u8 hidden_raid_component; /* hrc - don't expose*/
|
||||
};
|
||||
|
||||
struct mptsas_discovery_event {
|
||||
struct work_struct work;
|
||||
MPT_ADAPTER *ioc;
|
||||
};
|
||||
|
||||
/*
|
||||
* SAS topology structures
|
||||
*
|
||||
* The MPT Fusion firmware interface spreads information about the
|
||||
* SAS topology over many manufacture pages, thus we need some data
|
||||
* structure to collect it and process it for the SAS transport class.
|
||||
*/
|
||||
|
||||
struct mptsas_devinfo {
|
||||
u16 handle; /* unique id to address this device */
|
||||
u16 handle_parent; /* unique id to address parent device */
|
||||
u16 handle_enclosure; /* enclosure identifier of the enclosure */
|
||||
u16 slot; /* physical slot in enclosure */
|
||||
u8 phy_id; /* phy number of parent device */
|
||||
u8 port_id; /* sas physical port this device
|
||||
is assoc'd with */
|
||||
u8 id; /* logical target id of this device */
|
||||
u32 phys_disk_num; /* phys disk id, for csmi-ioctls */
|
||||
u8 channel; /* logical bus number of this device */
|
||||
u64 sas_address; /* WWN of this device,
|
||||
SATA is assigned by HBA,expander */
|
||||
u32 device_info; /* bitfield detailed info about this device */
|
||||
};
|
||||
|
||||
/*
|
||||
* Specific details on ports, wide/narrow
|
||||
*/
|
||||
struct mptsas_portinfo_details{
|
||||
u16 num_phys; /* number of phys belong to this port */
|
||||
u64 phy_bitmask; /* TODO, extend support for 255 phys */
|
||||
struct sas_rphy *rphy; /* transport layer rphy object */
|
||||
struct sas_port *port; /* transport layer port object */
|
||||
struct scsi_target *starget;
|
||||
struct mptsas_portinfo *port_info;
|
||||
};
|
||||
|
||||
struct mptsas_phyinfo {
|
||||
u16 handle; /* unique id to address this */
|
||||
u8 phy_id; /* phy index */
|
||||
u8 port_id; /* firmware port identifier */
|
||||
u8 negotiated_link_rate; /* nego'd link rate for this phy */
|
||||
u8 hw_link_rate; /* hardware max/min phys link rate */
|
||||
u8 programmed_link_rate; /* programmed max/min phy link rate */
|
||||
u8 sas_port_add_phy; /* flag to request sas_port_add_phy*/
|
||||
struct mptsas_devinfo identify; /* point to phy device info */
|
||||
struct mptsas_devinfo attached; /* point to attached device info */
|
||||
struct sas_phy *phy; /* transport layer phy object */
|
||||
struct mptsas_portinfo *portinfo;
|
||||
struct mptsas_portinfo_details * port_details;
|
||||
};
|
||||
|
||||
struct mptsas_portinfo {
|
||||
struct list_head list;
|
||||
u16 num_phys; /* number of phys */
|
||||
struct mptsas_phyinfo *phy_info;
|
||||
};
|
||||
|
||||
struct mptsas_enclosure {
|
||||
u64 enclosure_logical_id; /* The WWN for the enclosure */
|
||||
u16 enclosure_handle; /* unique id to address this */
|
||||
u16 flags; /* details enclosure management */
|
||||
u16 num_slot; /* num slots */
|
||||
u16 start_slot; /* first slot */
|
||||
u8 start_id; /* starting logical target id */
|
||||
u8 start_channel; /* starting logical channel id */
|
||||
u8 sep_id; /* SEP device logical target id */
|
||||
u8 sep_channel; /* SEP channel logical channel id */
|
||||
};
|
||||
|
||||
static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
|
||||
MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
|
||||
{
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "---- IO UNIT PAGE 0 ------------\n"));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->AttachedDeviceHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Controller Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->ControllerDevHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Port=0x%X\n", phy_data->Port));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Port Flags=0x%X\n", phy_data->PortFlags));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "PHY Flags=0x%X\n", phy_data->PhyFlags));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Controller PHY Device Info=0x%X\n",
|
||||
le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "DiscoveryStatus=0x%X\n\n",
|
||||
le32_to_cpu(phy_data->DiscoveryStatus)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"---- IO UNIT PAGE 0 ------------\n", ioc->name));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(phy_data->AttachedDeviceHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Controller Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(phy_data->ControllerDevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port=0x%X\n",
|
||||
ioc->name, phy_data->Port));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port Flags=0x%X\n",
|
||||
ioc->name, phy_data->PortFlags));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Flags=0x%X\n",
|
||||
ioc->name, phy_data->PhyFlags));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
|
||||
ioc->name, phy_data->NegotiatedLinkRate));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Controller PHY Device Info=0x%X\n", ioc->name,
|
||||
le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DiscoveryStatus=0x%X\n\n",
|
||||
ioc->name, le32_to_cpu(phy_data->DiscoveryStatus)));
|
||||
}
|
||||
|
||||
static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
|
||||
@@ -225,27 +126,41 @@ static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 0 ------------\n"));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg0->AttachedDevHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n",
|
||||
(unsigned long long)le64_to_cpu(sas_address)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Info=0x%X\n",
|
||||
le32_to_cpu(pg0->AttachedDeviceInfo)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Change Count=0x%X\n", pg0->ChangeCount));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "PHY Info=0x%X\n\n", le32_to_cpu(pg0->PhyInfo)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"---- SAS PHY PAGE 0 ------------\n", ioc->name));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Attached Device Handle=0x%X\n", ioc->name,
|
||||
le16_to_cpu(pg0->AttachedDevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
|
||||
ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Attached PHY Identifier=0x%X\n", ioc->name,
|
||||
pg0->AttachedPhyIdentifier));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Attached Device Info=0x%X\n",
|
||||
ioc->name, le32_to_cpu(pg0->AttachedDeviceInfo)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
|
||||
ioc->name, pg0->ProgrammedLinkRate));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Change Count=0x%X\n",
|
||||
ioc->name, pg0->ChangeCount));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Info=0x%X\n\n",
|
||||
ioc->name, le32_to_cpu(pg0->PhyInfo)));
|
||||
}
|
||||
|
||||
static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
|
||||
{
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 1 ------------\n"));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Running Disparity Error Count=0x%x\n",
|
||||
pg1->RunningDisparityErrorCount));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "PHY Reset Problem Count=0x%x\n\n", pg1->PhyResetProblemCount));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"---- SAS PHY PAGE 1 ------------\n", ioc->name));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Invalid Dword Count=0x%x\n",
|
||||
ioc->name, pg1->InvalidDwordCount));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Running Disparity Error Count=0x%x\n", ioc->name,
|
||||
pg1->RunningDisparityErrorCount));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Loss Dword Synch Count=0x%x\n", ioc->name,
|
||||
pg1->LossDwordSynchCount));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"PHY Reset Problem Count=0x%x\n\n", ioc->name,
|
||||
pg1->PhyResetProblemCount));
|
||||
}
|
||||
|
||||
static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
|
||||
@@ -254,37 +169,53 @@ static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "---- SAS DEVICE PAGE 0 ---------\n"));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Slot=0x%X\n", le16_to_cpu(pg0->Slot)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", (unsigned long long)
|
||||
le64_to_cpu(sas_address)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Target ID=0x%X\n", pg0->TargetID));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Bus=0x%X\n", pg0->Bus));
|
||||
/* The PhyNum field specifies the PHY number of the parent
|
||||
* device this device is linked to
|
||||
*/
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Parent Phy Num=0x%X\n", pg0->PhyNum));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Flags=0x%X\n", le16_to_cpu(pg0->Flags)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n\n", pg0->PhysicalPort));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"---- SAS DEVICE PAGE 0 ---------\n", ioc->name));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->DevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->ParentDevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Enclosure Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->EnclosureHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Slot=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->Slot)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
|
||||
ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Target ID=0x%X\n",
|
||||
ioc->name, pg0->TargetID));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Bus=0x%X\n",
|
||||
ioc->name, pg0->Bus));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Phy Num=0x%X\n",
|
||||
ioc->name, pg0->PhyNum));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Access Status=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->AccessStatus)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Device Info=0x%X\n",
|
||||
ioc->name, le32_to_cpu(pg0->DeviceInfo)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Flags=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg0->Flags)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n\n",
|
||||
ioc->name, pg0->PhysicalPort));
|
||||
}
|
||||
|
||||
static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
|
||||
{
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "---- SAS EXPANDER PAGE 1 ------------\n"));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n", pg1->PhysicalPort));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "PHY Identifier=0x%X\n", pg1->PhyIdentifier));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Hardware Link Rate=0x%X\n", pg1->HwLinkRate));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Owner Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg1->OwnerDevHandle)));
|
||||
dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n\n",
|
||||
le16_to_cpu(pg1->AttachedDevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"---- SAS EXPANDER PAGE 1 ------------\n", ioc->name));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n",
|
||||
ioc->name, pg1->PhysicalPort));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Identifier=0x%X\n",
|
||||
ioc->name, pg1->PhyIdentifier));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
|
||||
ioc->name, pg1->NegotiatedLinkRate));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
|
||||
ioc->name, pg1->ProgrammedLinkRate));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hardware Link Rate=0x%X\n",
|
||||
ioc->name, pg1->HwLinkRate));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Owner Device Handle=0x%X\n",
|
||||
ioc->name, le16_to_cpu(pg1->OwnerDevHandle)));
|
||||
dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Attached Device Handle=0x%X\n\n", ioc->name,
|
||||
le16_to_cpu(pg1->AttachedDevHandle)));
|
||||
}
|
||||
|
||||
static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
|
||||
@@ -354,8 +285,8 @@ mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_detai
|
||||
port_info = port_details->port_info;
|
||||
phy_info = port_info->phy_info;
|
||||
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "%s: [%p]: num_phys=%02d "
|
||||
"bitmask=0x%016llX\n", __FUNCTION__, port_details,
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d "
|
||||
"bitmask=0x%016llX\n", ioc->name, __FUNCTION__, port_details,
|
||||
port_details->num_phys, (unsigned long long)
|
||||
port_details->phy_bitmask));
|
||||
|
||||
@@ -382,14 +313,15 @@ mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rp
|
||||
{
|
||||
if (phy_info->port_details) {
|
||||
phy_info->port_details->rphy = rphy;
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n",
|
||||
ioc->name, rphy));
|
||||
}
|
||||
|
||||
if (rphy) {
|
||||
dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
|
||||
&rphy->dev, "add:"));
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "rphy=%p release=%p\n",
|
||||
rphy, rphy->dev.release));
|
||||
&rphy->dev, MYIOC_s_FMT "add:", ioc->name));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n",
|
||||
ioc->name, rphy, rphy->dev.release));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,9 +342,9 @@ mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_po
|
||||
|
||||
if (port) {
|
||||
dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
|
||||
&port->dev, "add:"));
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "port=%p release=%p\n",
|
||||
port, port->dev.release));
|
||||
&port->dev, MYIOC_s_FMT "add:", ioc->name));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "port=%p release=%p\n",
|
||||
ioc->name, port, port->dev.release));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -463,9 +395,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
* Removing a phy from a port, letting the last
|
||||
* phy be removed by firmware events.
|
||||
*/
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG
|
||||
"%s: [%p]: deleting phy = %d\n",
|
||||
__FUNCTION__, port_details, i));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s: [%p]: deleting phy = %d\n",
|
||||
ioc->name, __FUNCTION__, port_details, i));
|
||||
port_details->num_phys--;
|
||||
port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
|
||||
memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
|
||||
@@ -479,8 +411,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
phy_info = port_info->phy_info;
|
||||
for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
|
||||
sas_address = phy_info->attached.sas_address;
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
|
||||
i, (unsigned long long)sas_address));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n",
|
||||
ioc->name, i, (unsigned long long)sas_address));
|
||||
if (!sas_address)
|
||||
continue;
|
||||
port_details = phy_info->port_details;
|
||||
@@ -498,9 +430,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
port_details->phy_bitmask |=
|
||||
(1 << phy_info->phy_id);
|
||||
phy_info->sas_port_add_phy=1;
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "\t\tForming port\n\t\t"
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t"
|
||||
"phy_id=%d sas_address=0x%018llX\n",
|
||||
i, (unsigned long long)sas_address));
|
||||
ioc->name, i, (unsigned long long)sas_address));
|
||||
phy_info->port_details = port_details;
|
||||
}
|
||||
|
||||
@@ -515,9 +447,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
continue;
|
||||
if (phy_info_cmp->port_details == port_details )
|
||||
continue;
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"\t\tphy_id=%d sas_address=0x%018llX\n",
|
||||
j, (unsigned long long)
|
||||
ioc->name, j, (unsigned long long)
|
||||
phy_info_cmp->attached.sas_address));
|
||||
if (phy_info_cmp->port_details) {
|
||||
port_details->rphy =
|
||||
@@ -549,15 +481,15 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
port_details = port_info->phy_info[i].port_details;
|
||||
if (!port_details)
|
||||
continue;
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s: [%p]: phy_id=%02d num_phys=%02d "
|
||||
"bitmask=0x%016llX\n", __FUNCTION__,
|
||||
"bitmask=0x%016llX\n", ioc->name, __FUNCTION__,
|
||||
port_details, i, port_details->num_phys,
|
||||
(unsigned long long)port_details->phy_bitmask));
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG"\t\tport = %p rphy=%p\n",
|
||||
port_details->port, port_details->rphy));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n",
|
||||
ioc->name, port_details->port, port_details->rphy));
|
||||
}
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG"\n"));
|
||||
dsaswideprintk(ioc, printk("\n"));
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
}
|
||||
|
||||
@@ -573,15 +505,15 @@ static VirtTarget *
|
||||
mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
|
||||
{
|
||||
struct scsi_device *sdev;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
VirtTarget *vtarget = NULL;
|
||||
|
||||
shost_for_each_device(sdev, ioc->sh) {
|
||||
if ((vdev = sdev->hostdata) == NULL)
|
||||
if ((vdevice = sdev->hostdata) == NULL)
|
||||
continue;
|
||||
if (vdev->vtarget->id == id &&
|
||||
vdev->vtarget->channel == channel)
|
||||
vtarget = vdev->vtarget;
|
||||
if (vdevice->vtarget->id == id &&
|
||||
vdevice->vtarget->channel == channel)
|
||||
vtarget = vdevice->vtarget;
|
||||
}
|
||||
return vtarget;
|
||||
}
|
||||
@@ -623,13 +555,7 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
|
||||
|
||||
DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
|
||||
|
||||
if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
|
||||
sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
|
||||
mpt_free_msg_frame(ioc, mf);
|
||||
dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
|
||||
ioc->name,__FUNCTION__, __LINE__));
|
||||
return 0;
|
||||
}
|
||||
mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -649,7 +575,7 @@ static void
|
||||
mptsas_target_reset_queue(MPT_ADAPTER *ioc,
|
||||
EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
|
||||
{
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
VirtTarget *vtarget = NULL;
|
||||
struct mptsas_target_reset_event *target_reset_list;
|
||||
u8 id, channel;
|
||||
@@ -696,7 +622,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc,
|
||||
static void
|
||||
mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
|
||||
{
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
struct list_head *head = &hd->target_reset_list;
|
||||
struct mptsas_target_reset_event *target_reset_list;
|
||||
struct mptsas_hotplug_event *ev;
|
||||
@@ -813,7 +739,7 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
|
||||
if (!ioc->sh || !ioc->sh->hostdata)
|
||||
goto out;
|
||||
hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
hd = shost_priv(ioc->sh);
|
||||
if (!hd->ioc)
|
||||
goto out;
|
||||
|
||||
@@ -913,19 +839,20 @@ static int
|
||||
mptsas_target_alloc(struct scsi_target *starget)
|
||||
{
|
||||
struct Scsi_Host *host = dev_to_shost(&starget->dev);
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
VirtTarget *vtarget;
|
||||
u8 id, channel;
|
||||
struct sas_rphy *rphy;
|
||||
struct mptsas_portinfo *p;
|
||||
int i;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
|
||||
if (!vtarget)
|
||||
return -ENOMEM;
|
||||
|
||||
vtarget->starget = starget;
|
||||
vtarget->ioc_id = hd->ioc->id;
|
||||
vtarget->ioc_id = ioc->id;
|
||||
vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
|
||||
id = starget->id;
|
||||
channel = 0;
|
||||
@@ -934,15 +861,15 @@ mptsas_target_alloc(struct scsi_target *starget)
|
||||
* RAID volumes placed beyond the last expected port.
|
||||
*/
|
||||
if (starget->channel == MPTSAS_RAID_CHANNEL) {
|
||||
for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
|
||||
if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
|
||||
channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
|
||||
for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
|
||||
if (id == ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
|
||||
channel = ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rphy = dev_to_rphy(starget->dev.parent);
|
||||
mutex_lock(&hd->ioc->sas_topology_mutex);
|
||||
list_for_each_entry(p, &hd->ioc->sas_topology, list) {
|
||||
mutex_lock(&ioc->sas_topology_mutex);
|
||||
list_for_each_entry(p, &ioc->sas_topology, list) {
|
||||
for (i = 0; i < p->num_phys; i++) {
|
||||
if (p->phy_info[i].attached.sas_address !=
|
||||
rphy->identify.sas_address)
|
||||
@@ -954,18 +881,18 @@ mptsas_target_alloc(struct scsi_target *starget)
|
||||
/*
|
||||
* Exposing hidden raid components
|
||||
*/
|
||||
if (mptscsih_is_phys_disk(hd->ioc, channel, id)) {
|
||||
id = mptscsih_raid_id_to_num(hd->ioc,
|
||||
if (mptscsih_is_phys_disk(ioc, channel, id)) {
|
||||
id = mptscsih_raid_id_to_num(ioc,
|
||||
channel, id);
|
||||
vtarget->tflags |=
|
||||
MPT_TARGET_FLAGS_RAID_COMPONENT;
|
||||
p->phy_info[i].attached.phys_disk_num = id;
|
||||
}
|
||||
mutex_unlock(&hd->ioc->sas_topology_mutex);
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&hd->ioc->sas_topology_mutex);
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
|
||||
kfree(vtarget);
|
||||
return -ENXIO;
|
||||
@@ -981,10 +908,11 @@ static void
|
||||
mptsas_target_destroy(struct scsi_target *starget)
|
||||
{
|
||||
struct Scsi_Host *host = dev_to_shost(&starget->dev);
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
struct sas_rphy *rphy;
|
||||
struct mptsas_portinfo *p;
|
||||
int i;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
if (!starget->hostdata)
|
||||
return;
|
||||
@@ -993,7 +921,7 @@ mptsas_target_destroy(struct scsi_target *starget)
|
||||
goto out;
|
||||
|
||||
rphy = dev_to_rphy(starget->dev.parent);
|
||||
list_for_each_entry(p, &hd->ioc->sas_topology, list) {
|
||||
list_for_each_entry(p, &ioc->sas_topology, list) {
|
||||
for (i = 0; i < p->num_phys; i++) {
|
||||
if (p->phy_info[i].attached.sas_address !=
|
||||
rphy->identify.sas_address)
|
||||
@@ -1013,61 +941,62 @@ static int
|
||||
mptsas_slave_alloc(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
struct sas_rphy *rphy;
|
||||
struct mptsas_portinfo *p;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
struct scsi_target *starget;
|
||||
int i;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdev) {
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
|
||||
hd->ioc->name, sizeof(VirtDevice));
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
starget = scsi_target(sdev);
|
||||
vdev->vtarget = starget->hostdata;
|
||||
vdevice->vtarget = starget->hostdata;
|
||||
|
||||
if (sdev->channel == MPTSAS_RAID_CHANNEL)
|
||||
goto out;
|
||||
|
||||
rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
|
||||
mutex_lock(&hd->ioc->sas_topology_mutex);
|
||||
list_for_each_entry(p, &hd->ioc->sas_topology, list) {
|
||||
mutex_lock(&ioc->sas_topology_mutex);
|
||||
list_for_each_entry(p, &ioc->sas_topology, list) {
|
||||
for (i = 0; i < p->num_phys; i++) {
|
||||
if (p->phy_info[i].attached.sas_address !=
|
||||
rphy->identify.sas_address)
|
||||
continue;
|
||||
vdev->lun = sdev->lun;
|
||||
vdevice->lun = sdev->lun;
|
||||
/*
|
||||
* Exposing hidden raid components
|
||||
*/
|
||||
if (mptscsih_is_phys_disk(hd->ioc,
|
||||
if (mptscsih_is_phys_disk(ioc,
|
||||
p->phy_info[i].attached.channel,
|
||||
p->phy_info[i].attached.id))
|
||||
sdev->no_uld_attach = 1;
|
||||
mutex_unlock(&hd->ioc->sas_topology_mutex);
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&hd->ioc->sas_topology_mutex);
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
|
||||
kfree(vdev);
|
||||
kfree(vdevice);
|
||||
return -ENXIO;
|
||||
|
||||
out:
|
||||
vdev->vtarget->num_luns++;
|
||||
sdev->hostdata = vdev;
|
||||
vdevice->vtarget->num_luns++;
|
||||
sdev->hostdata = vdevice;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
VirtDevice *vdev = SCpnt->device->hostdata;
|
||||
VirtDevice *vdevice = SCpnt->device->hostdata;
|
||||
|
||||
if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) {
|
||||
if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {
|
||||
SCpnt->result = DID_NO_CONNECT << 16;
|
||||
done(SCpnt);
|
||||
return 0;
|
||||
@@ -1239,10 +1168,8 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
|
||||
/* process the completed Reply Message Frame */
|
||||
reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
|
||||
if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
|
||||
printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
|
||||
__FUNCTION__,
|
||||
reply->IOCStatus,
|
||||
reply->IOCLogInfo);
|
||||
printk(MYIOC_s_INFO_FMT "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
|
||||
ioc->name, __FUNCTION__, reply->IOCStatus, reply->IOCLogInfo);
|
||||
error = -ENXIO;
|
||||
goto out_unlock;
|
||||
}
|
||||
@@ -1328,16 +1255,16 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
u64 sas_address = 0;
|
||||
|
||||
if (!rsp) {
|
||||
printk(KERN_ERR "%s: the smp response space is missing\n",
|
||||
__FUNCTION__);
|
||||
printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n",
|
||||
ioc->name, __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* do we need to support multiple segments? */
|
||||
if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) {
|
||||
printk(KERN_ERR "%s: multiple segments req %u %u, rsp %u %u\n",
|
||||
__FUNCTION__, req->bio->bi_vcnt, req->data_len,
|
||||
rsp->bio->bi_vcnt, rsp->data_len);
|
||||
printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n",
|
||||
ioc->name, __FUNCTION__, req->bio->bi_vcnt, req->data_len,
|
||||
rsp->bio->bi_vcnt, rsp->data_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1402,7 +1329,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
|
||||
timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
|
||||
if (!timeleft) {
|
||||
printk(KERN_ERR "%s: smp timeout!\n", __FUNCTION__);
|
||||
printk(MYIOC_s_ERR_FMT "%s: smp timeout!\n", ioc->name, __FUNCTION__);
|
||||
/* On timeout reset the board */
|
||||
mpt_HardResetHandler(ioc, CAN_SLEEP);
|
||||
ret = -ETIMEDOUT;
|
||||
@@ -1417,8 +1344,8 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
memcpy(req->sense, smprep, sizeof(*smprep));
|
||||
req->sense_len = sizeof(*smprep);
|
||||
} else {
|
||||
printk(KERN_ERR "%s: smp passthru reply failed to be returned\n",
|
||||
__FUNCTION__);
|
||||
printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n",
|
||||
ioc->name, __FUNCTION__);
|
||||
ret = -ENXIO;
|
||||
}
|
||||
unmap:
|
||||
@@ -2062,12 +1989,12 @@ static int mptsas_probe_one_phy(struct device *dev,
|
||||
goto out;
|
||||
}
|
||||
mptsas_set_port(ioc, phy_info, port);
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"sas_port_alloc: port=%p dev=%p port_id=%d\n",
|
||||
port, dev, port->port_identifier));
|
||||
ioc->name, port, dev, port->port_identifier));
|
||||
}
|
||||
dsaswideprintk(ioc, printk(KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
|
||||
phy_info->phy_id));
|
||||
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n",
|
||||
ioc->name, phy_info->phy_id));
|
||||
sas_port_add_phy(port, phy_info->phy);
|
||||
phy_info->sas_port_add_phy = 0;
|
||||
}
|
||||
@@ -2369,8 +2296,9 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
|
||||
expander_sas_address)
|
||||
continue;
|
||||
dsaswideprintk(ioc,
|
||||
dev_printk(KERN_DEBUG, &port->dev,
|
||||
"delete port (%d)\n", port->port_identifier));
|
||||
dev_printk(KERN_DEBUG, &port->dev,
|
||||
MYIOC_s_FMT "delete port (%d)\n", ioc->name,
|
||||
port->port_identifier));
|
||||
sas_port_delete(port);
|
||||
mptsas_port_delete(ioc, phy_info->port_details);
|
||||
}
|
||||
@@ -2613,7 +2541,7 @@ mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
|
||||
|
||||
ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
|
||||
if (!ev) {
|
||||
printk(KERN_WARNING "mptsas: lost hotplug event\n");
|
||||
printk(MYIOC_s_WARN_FMT "mptsas: lost hotplug event\n", ioc->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2754,8 +2682,8 @@ mptsas_hotplug_work(struct work_struct *work)
|
||||
printk(MYIOC_s_INFO_FMT
|
||||
"removing %s device, channel %d, id %d, phy %d\n",
|
||||
ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
|
||||
dev_printk(KERN_DEBUG, &port->dev,
|
||||
"delete port (%d)\n", port->port_identifier);
|
||||
dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT
|
||||
"delete port (%d)\n", ioc->name, port->port_identifier);
|
||||
sas_port_delete(port);
|
||||
mptsas_port_delete(ioc, phy_info->port_details);
|
||||
break;
|
||||
@@ -2796,8 +2724,8 @@ mptsas_hotplug_work(struct work_struct *work)
|
||||
|
||||
if (!vtarget) {
|
||||
dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
|
||||
"%s: exit at line=%d\n", ioc->name,
|
||||
__FUNCTION__, __LINE__));
|
||||
"%s: exit at line=%d\n", ioc->name,
|
||||
__FUNCTION__, __LINE__));
|
||||
break;
|
||||
}
|
||||
/*
|
||||
@@ -2930,7 +2858,7 @@ mptsas_send_sas_event(MPT_ADAPTER *ioc,
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
|
||||
ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
|
||||
if (!ev) {
|
||||
printk(KERN_WARNING "mptsas: lost hotplug event\n");
|
||||
printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2989,7 +2917,7 @@ mptsas_send_raid_event(MPT_ADAPTER *ioc,
|
||||
|
||||
ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
|
||||
if (!ev) {
|
||||
printk(KERN_WARNING "mptsas: lost hotplug event\n");
|
||||
printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3288,20 +3216,22 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
sh->sg_tablesize = numSGE;
|
||||
}
|
||||
|
||||
hd = (MPT_SCSI_HOST *) sh->hostdata;
|
||||
hd = shost_priv(sh);
|
||||
hd->ioc = ioc;
|
||||
|
||||
/* SCSI needs scsi_cmnd lookup table!
|
||||
* (with size equal to req_depth*PtrSz!)
|
||||
*/
|
||||
hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!hd->ScsiLookup) {
|
||||
ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!ioc->ScsiLookup) {
|
||||
error = -ENOMEM;
|
||||
spin_unlock_irqrestore(&ioc->FreeQlock, flags);
|
||||
goto out_mptsas_probe;
|
||||
}
|
||||
spin_lock_init(&ioc->scsi_lookup_lock);
|
||||
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, hd->ScsiLookup));
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
@@ -3340,8 +3270,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
error = scsi_add_host(sh, &ioc->pcidev->dev);
|
||||
if (error) {
|
||||
dprintk(ioc, printk(KERN_ERR MYNAM
|
||||
"scsi_add_host failed\n"));
|
||||
dprintk(ioc, printk(MYIOC_s_ERR_FMT
|
||||
"scsi_add_host failed\n", ioc->name));
|
||||
goto out_mptsas_probe;
|
||||
}
|
||||
|
||||
|
158
drivers/message/fusion/mptsas.h
Normal file
158
drivers/message/fusion/mptsas.h
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptsas.h
|
||||
* High performance SCSI + LAN / Fibre Channel device drivers.
|
||||
* For use with PCI chip/adapter(s):
|
||||
* LSIFC9xx/LSI409xx Fibre Channel
|
||||
* running LSI MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
NO WARRANTY
|
||||
THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
|
||||
LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
|
||||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
|
||||
solely responsible for determining the appropriateness of using and
|
||||
distributing the Program and assumes all risks associated with its
|
||||
exercise of rights under this Agreement, including but not limited to
|
||||
the risks and costs of program errors, damage to or loss of data,
|
||||
programs or equipment, and unavailability or interruption of operations.
|
||||
|
||||
DISCLAIMER OF LIABILITY
|
||||
NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
|
||||
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef MPTSAS_H_INCLUDED
|
||||
#define MPTSAS_H_INCLUDED
|
||||
/*{-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
||||
struct mptsas_target_reset_event {
|
||||
struct list_head list;
|
||||
EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data;
|
||||
u8 target_reset_issued;
|
||||
};
|
||||
|
||||
enum mptsas_hotplug_action {
|
||||
MPTSAS_ADD_DEVICE,
|
||||
MPTSAS_DEL_DEVICE,
|
||||
MPTSAS_ADD_RAID,
|
||||
MPTSAS_DEL_RAID,
|
||||
MPTSAS_ADD_INACTIVE_VOLUME,
|
||||
MPTSAS_IGNORE_EVENT,
|
||||
};
|
||||
|
||||
struct mptsas_hotplug_event {
|
||||
struct work_struct work;
|
||||
MPT_ADAPTER *ioc;
|
||||
enum mptsas_hotplug_action event_type;
|
||||
u64 sas_address;
|
||||
u8 channel;
|
||||
u8 id;
|
||||
u32 device_info;
|
||||
u16 handle;
|
||||
u16 parent_handle;
|
||||
u8 phy_id;
|
||||
u8 phys_disk_num_valid; /* hrc (hidden raid component) */
|
||||
u8 phys_disk_num; /* hrc - unique index*/
|
||||
u8 hidden_raid_component; /* hrc - don't expose*/
|
||||
};
|
||||
|
||||
struct mptsas_discovery_event {
|
||||
struct work_struct work;
|
||||
MPT_ADAPTER *ioc;
|
||||
};
|
||||
|
||||
/*
|
||||
* SAS topology structures
|
||||
*
|
||||
* The MPT Fusion firmware interface spreads information about the
|
||||
* SAS topology over many manufacture pages, thus we need some data
|
||||
* structure to collect it and process it for the SAS transport class.
|
||||
*/
|
||||
|
||||
struct mptsas_devinfo {
|
||||
u16 handle; /* unique id to address this device */
|
||||
u16 handle_parent; /* unique id to address parent device */
|
||||
u16 handle_enclosure; /* enclosure identifier of the enclosure */
|
||||
u16 slot; /* physical slot in enclosure */
|
||||
u8 phy_id; /* phy number of parent device */
|
||||
u8 port_id; /* sas physical port this device
|
||||
is assoc'd with */
|
||||
u8 id; /* logical target id of this device */
|
||||
u32 phys_disk_num; /* phys disk id, for csmi-ioctls */
|
||||
u8 channel; /* logical bus number of this device */
|
||||
u64 sas_address; /* WWN of this device,
|
||||
SATA is assigned by HBA,expander */
|
||||
u32 device_info; /* bitfield detailed info about this device */
|
||||
};
|
||||
|
||||
/*
|
||||
* Specific details on ports, wide/narrow
|
||||
*/
|
||||
struct mptsas_portinfo_details{
|
||||
u16 num_phys; /* number of phys belong to this port */
|
||||
u64 phy_bitmask; /* TODO, extend support for 255 phys */
|
||||
struct sas_rphy *rphy; /* transport layer rphy object */
|
||||
struct sas_port *port; /* transport layer port object */
|
||||
struct scsi_target *starget;
|
||||
struct mptsas_portinfo *port_info;
|
||||
};
|
||||
|
||||
struct mptsas_phyinfo {
|
||||
u16 handle; /* unique id to address this */
|
||||
u8 phy_id; /* phy index */
|
||||
u8 port_id; /* firmware port identifier */
|
||||
u8 negotiated_link_rate; /* nego'd link rate for this phy */
|
||||
u8 hw_link_rate; /* hardware max/min phys link rate */
|
||||
u8 programmed_link_rate; /* programmed max/min phy link rate */
|
||||
u8 sas_port_add_phy; /* flag to request sas_port_add_phy*/
|
||||
struct mptsas_devinfo identify; /* point to phy device info */
|
||||
struct mptsas_devinfo attached; /* point to attached device info */
|
||||
struct sas_phy *phy; /* transport layer phy object */
|
||||
struct mptsas_portinfo *portinfo;
|
||||
struct mptsas_portinfo_details * port_details;
|
||||
};
|
||||
|
||||
struct mptsas_portinfo {
|
||||
struct list_head list;
|
||||
u16 num_phys; /* number of phys */
|
||||
struct mptsas_phyinfo *phy_info;
|
||||
};
|
||||
|
||||
struct mptsas_enclosure {
|
||||
u64 enclosure_logical_id; /* The WWN for the enclosure */
|
||||
u16 enclosure_handle; /* unique id to address this */
|
||||
u16 flags; /* details enclosure management */
|
||||
u16 num_slot; /* num slots */
|
||||
u16 start_slot; /* first slot */
|
||||
u8 start_id; /* starting logical target id */
|
||||
u8 start_channel; /* starting logical channel id */
|
||||
u8 sep_id; /* SEP device logical target id */
|
||||
u8 sep_channel; /* SEP channel logical channel id */
|
||||
};
|
||||
|
||||
/*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@@ -3,9 +3,9 @@
|
||||
* High performance SCSI / Fibre Channel SCSI Host device driver.
|
||||
* For use with PCI chip/adapter(s):
|
||||
* LSIFC9xx/LSI409xx Fibre Channel
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
|
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
* linux/drivers/message/fusion/mptspi.c
|
||||
* For use with LSI Logic PCI chip/adapter(s)
|
||||
* running LSI Logic Fusion MPT (Message Passing Technology) firmware.
|
||||
* For use with LSI PCI chip/adapter(s)
|
||||
* running LSI Fusion MPT (Message Passing Technology) firmware.
|
||||
*
|
||||
* Copyright (c) 1999-2007 LSI Logic Corporation
|
||||
* Copyright (c) 1999-2007 LSI Corporation
|
||||
* (mailto:DL-MPTFusionLinux@lsi.com)
|
||||
*
|
||||
*/
|
||||
@@ -90,9 +90,9 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *,
|
||||
|
||||
static struct scsi_transport_template *mptspi_transport_template = NULL;
|
||||
|
||||
static int mptspiDoneCtx = -1;
|
||||
static int mptspiTaskCtx = -1;
|
||||
static int mptspiInternalCtx = -1; /* Used only for internal commands */
|
||||
static u8 mptspiDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptspiTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptspiInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
|
||||
|
||||
/**
|
||||
* mptspi_setTargetNegoParms - Update the target negotiation parameters
|
||||
@@ -107,7 +107,8 @@ static void
|
||||
mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
|
||||
struct scsi_device *sdev)
|
||||
{
|
||||
SpiCfgData *pspi_data = &hd->ioc->spi_data;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
SpiCfgData *pspi_data = &ioc->spi_data;
|
||||
int id = (int) target->id;
|
||||
int nvram;
|
||||
u8 width = MPT_NARROW;
|
||||
@@ -138,9 +139,10 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
|
||||
else {
|
||||
factor = MPT_ULTRA320;
|
||||
if (scsi_device_qas(sdev)) {
|
||||
ddvprintk(hd->ioc,
|
||||
printk(KERN_DEBUG "Enabling QAS due to "
|
||||
"byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
|
||||
ddvprintk(ioc,
|
||||
printk(MYIOC_s_DEBUG_FMT "Enabling QAS due to "
|
||||
"byte56=%02x on id=%d!\n", ioc->name,
|
||||
scsi_device_qas(sdev), id));
|
||||
noQas = 0;
|
||||
}
|
||||
if (sdev->type == TYPE_TAPE &&
|
||||
@@ -227,8 +229,8 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
|
||||
/* Disable QAS in a mixed configuration case
|
||||
*/
|
||||
|
||||
ddvprintk(hd->ioc, printk(KERN_DEBUG
|
||||
"Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Disabling QAS due to noQas=%02x on id=%d!\n", ioc->name, noQas, id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,7 +304,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
|
||||
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
|
||||
ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
|
||||
ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
|
||||
|
||||
mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
|
||||
|
||||
@@ -374,14 +376,15 @@ static int
|
||||
mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
|
||||
{
|
||||
int i, rc = 0;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
if (!hd->ioc->raid_data.pIocPg2)
|
||||
if (!ioc->raid_data.pIocPg2)
|
||||
goto out;
|
||||
|
||||
if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
|
||||
if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
|
||||
goto out;
|
||||
for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
|
||||
if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
|
||||
for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
|
||||
if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
|
||||
rc = 1;
|
||||
goto out;
|
||||
}
|
||||
@@ -394,17 +397,19 @@ mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
|
||||
static int mptspi_target_alloc(struct scsi_target *starget)
|
||||
{
|
||||
struct Scsi_Host *shost = dev_to_shost(&starget->dev);
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(shost);
|
||||
VirtTarget *vtarget;
|
||||
MPT_ADAPTER *ioc;
|
||||
|
||||
if (hd == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
ioc = hd->ioc;
|
||||
vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
|
||||
if (!vtarget)
|
||||
return -ENOMEM;
|
||||
|
||||
vtarget->ioc_id = hd->ioc->id;
|
||||
vtarget->ioc_id = ioc->id;
|
||||
vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
|
||||
vtarget->id = (u8)starget->id;
|
||||
vtarget->channel = (u8)starget->channel;
|
||||
@@ -412,34 +417,34 @@ static int mptspi_target_alloc(struct scsi_target *starget)
|
||||
starget->hostdata = vtarget;
|
||||
|
||||
if (starget->channel == 1) {
|
||||
if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
|
||||
if (mptscsih_is_phys_disk(ioc, 0, starget->id) == 0)
|
||||
return 0;
|
||||
vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
|
||||
/* The real channel for this device is zero */
|
||||
vtarget->channel = 0;
|
||||
/* The actual physdisknum (for RAID passthrough) */
|
||||
vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
|
||||
vtarget->id = mptscsih_raid_id_to_num(ioc, 0,
|
||||
starget->id);
|
||||
}
|
||||
|
||||
if (starget->channel == 0 &&
|
||||
mptspi_is_raid(hd, starget->id)) {
|
||||
vtarget->raidVolume = 1;
|
||||
ddvprintk(hd->ioc, printk(KERN_DEBUG
|
||||
"RAID Volume @ channel=%d id=%d\n", starget->channel,
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"RAID Volume @ channel=%d id=%d\n", ioc->name, starget->channel,
|
||||
starget->id));
|
||||
}
|
||||
|
||||
if (hd->ioc->spi_data.nvram &&
|
||||
hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
|
||||
u32 nvram = hd->ioc->spi_data.nvram[starget->id];
|
||||
if (ioc->spi_data.nvram &&
|
||||
ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
|
||||
u32 nvram = ioc->spi_data.nvram[starget->id];
|
||||
spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
|
||||
spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
|
||||
} else {
|
||||
spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor;
|
||||
spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth;
|
||||
spi_min_period(starget) = ioc->spi_data.minSyncFactor;
|
||||
spi_max_width(starget) = ioc->spi_data.maxBusWidth;
|
||||
}
|
||||
spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset;
|
||||
spi_max_offset(starget) = ioc->spi_data.maxSyncOffset;
|
||||
|
||||
spi_offset(starget) = 0;
|
||||
mptspi_write_width(starget, 0);
|
||||
@@ -509,10 +514,10 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
|
||||
{
|
||||
struct Scsi_Host *shost = dev_to_shost(&starget->dev);
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(shost);
|
||||
struct _MPT_ADAPTER *ioc = hd->ioc;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0;
|
||||
dma_addr_t pg0_dma;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_0 *spi_dev_pg0;
|
||||
dma_addr_t spi_dev_pg0_dma;
|
||||
int size;
|
||||
struct _x_config_parms cfg;
|
||||
struct _CONFIG_PAGE_HEADER hdr;
|
||||
@@ -530,9 +535,10 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
|
||||
size += 2048;
|
||||
*/
|
||||
|
||||
pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
|
||||
if (pg0 == NULL) {
|
||||
starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
|
||||
spi_dev_pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &spi_dev_pg0_dma, GFP_KERNEL);
|
||||
if (spi_dev_pg0 == NULL) {
|
||||
starget_printk(KERN_ERR, starget, MYIOC_s_FMT
|
||||
"dma_alloc_coherent for parameters failed\n", ioc->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -546,22 +552,22 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = pg0_dma;
|
||||
cfg.physAddr = spi_dev_pg0_dma;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
cfg.dir = 0;
|
||||
cfg.pageAddr = starget->id;
|
||||
|
||||
if (mpt_config(ioc, &cfg)) {
|
||||
starget_printk(KERN_ERR, starget, "mpt_config failed\n");
|
||||
starget_printk(KERN_ERR, starget, MYIOC_s_FMT "mpt_config failed\n", ioc->name);
|
||||
goto out_free;
|
||||
}
|
||||
err = 0;
|
||||
memcpy(pass_pg0, pg0, size);
|
||||
memcpy(pass_pg0, spi_dev_pg0, size);
|
||||
|
||||
mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
|
||||
mptspi_print_read_nego(hd, starget, le32_to_cpu(spi_dev_pg0->NegotiatedParameters));
|
||||
|
||||
out_free:
|
||||
dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
|
||||
dma_free_coherent(&ioc->pcidev->dev, size, spi_dev_pg0, spi_dev_pg0_dma);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -588,11 +594,11 @@ static u32 mptspi_getRP(struct scsi_target *starget)
|
||||
static void mptspi_read_parameters(struct scsi_target *starget)
|
||||
{
|
||||
int nego;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_0 spi_dev_pg0;
|
||||
|
||||
mptspi_read_spi_device_pg0(starget, &pg0);
|
||||
mptspi_read_spi_device_pg0(starget, &spi_dev_pg0);
|
||||
|
||||
nego = le32_to_cpu(pg0.NegotiatedParameters);
|
||||
nego = le32_to_cpu(spi_dev_pg0.NegotiatedParameters);
|
||||
|
||||
spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
|
||||
spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
|
||||
@@ -612,12 +618,13 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
|
||||
{
|
||||
MpiRaidActionRequest_t *pReq;
|
||||
MPT_FRAME_HDR *mf;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
/* Get and Populate a free Frame
|
||||
*/
|
||||
if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
|
||||
ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
|
||||
hd->ioc->name));
|
||||
if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) {
|
||||
ddvprintk(ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
|
||||
ioc->name));
|
||||
return -EAGAIN;
|
||||
}
|
||||
pReq = (MpiRaidActionRequest_t *)mf;
|
||||
@@ -638,8 +645,8 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
|
||||
mpt_add_sge((char *)&pReq->ActionDataSGE,
|
||||
MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
|
||||
|
||||
ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
|
||||
hd->ioc->name, pReq->Action, channel, id));
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
|
||||
ioc->name, pReq->Action, channel, id));
|
||||
|
||||
hd->pLocal = NULL;
|
||||
hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
|
||||
@@ -651,7 +658,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
|
||||
hd->cmdPtr = mf;
|
||||
|
||||
add_timer(&hd->timer);
|
||||
mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
|
||||
mpt_put_msg_frame(ioc->InternalCtx, ioc, mf);
|
||||
wait_event(hd->scandv_waitq, hd->scandv_wait_done);
|
||||
|
||||
if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
|
||||
@@ -664,6 +671,7 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
||||
struct scsi_device *sdev)
|
||||
{
|
||||
VirtTarget *vtarget = scsi_target(sdev)->hostdata;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
/* no DV on RAID devices */
|
||||
if (sdev->channel == 0 &&
|
||||
@@ -673,8 +681,8 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
||||
/* If this is a piece of a RAID, then quiesce first */
|
||||
if (sdev->channel == 1 &&
|
||||
mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
|
||||
starget_printk(KERN_ERR, scsi_target(sdev),
|
||||
"Integrated RAID quiesce failed\n");
|
||||
starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT
|
||||
"Integrated RAID quiesce failed\n", ioc->name);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -684,8 +692,8 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
||||
|
||||
if (sdev->channel == 1 &&
|
||||
mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
|
||||
starget_printk(KERN_ERR, scsi_target(sdev),
|
||||
"Integrated RAID resume failed\n");
|
||||
starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT
|
||||
"Integrated RAID resume failed\n", ioc->name);
|
||||
|
||||
mptspi_read_parameters(sdev->sdev_target);
|
||||
spi_display_xfer_agreement(sdev->sdev_target);
|
||||
@@ -694,28 +702,29 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
||||
|
||||
static int mptspi_slave_alloc(struct scsi_device *sdev)
|
||||
{
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
|
||||
MPT_SCSI_HOST *hd = shost_priv(sdev->host);
|
||||
VirtTarget *vtarget;
|
||||
VirtDevice *vdev;
|
||||
VirtDevice *vdevice;
|
||||
struct scsi_target *starget;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
if (sdev->channel == 1 &&
|
||||
mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
|
||||
mptscsih_is_phys_disk(ioc, 0, sdev->id) == 0)
|
||||
return -ENXIO;
|
||||
|
||||
vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdev) {
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
|
||||
hd->ioc->name, sizeof(VirtDevice));
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
vdev->lun = sdev->lun;
|
||||
sdev->hostdata = vdev;
|
||||
vdevice->lun = sdev->lun;
|
||||
sdev->hostdata = vdevice;
|
||||
|
||||
starget = scsi_target(sdev);
|
||||
vtarget = starget->hostdata;
|
||||
vdev->vtarget = vtarget;
|
||||
vdevice->vtarget = vtarget;
|
||||
vtarget->num_luns++;
|
||||
|
||||
if (sdev->channel == 1)
|
||||
@@ -726,8 +735,7 @@ static int mptspi_slave_alloc(struct scsi_device *sdev)
|
||||
|
||||
static int mptspi_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct _MPT_SCSI_HOST *hd =
|
||||
(struct _MPT_SCSI_HOST *)sdev->host->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(sdev->host);
|
||||
VirtTarget *vtarget = scsi_target(sdev)->hostdata;
|
||||
int ret;
|
||||
|
||||
@@ -755,24 +763,25 @@ static int mptspi_slave_configure(struct scsi_device *sdev)
|
||||
static int
|
||||
mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
|
||||
VirtDevice *vdev = SCpnt->device->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host);
|
||||
VirtDevice *vdevice = SCpnt->device->hostdata;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
if (!vdev || !vdev->vtarget) {
|
||||
if (!vdevice || !vdevice->vtarget) {
|
||||
SCpnt->result = DID_NO_CONNECT << 16;
|
||||
done(SCpnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (SCpnt->device->channel == 1 &&
|
||||
mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
|
||||
mptscsih_is_phys_disk(ioc, 0, SCpnt->device->id) == 0) {
|
||||
SCpnt->result = DID_NO_CONNECT << 16;
|
||||
done(SCpnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (spi_dv_pending(scsi_target(SCpnt->device)))
|
||||
ddvprintk(hd->ioc, scsi_print_command(SCpnt));
|
||||
ddvprintk(ioc, scsi_print_command(SCpnt));
|
||||
|
||||
return mptscsih_qcmd(SCpnt,done);
|
||||
}
|
||||
@@ -829,7 +838,7 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
|
||||
{
|
||||
struct Scsi_Host *shost = dev_to_shost(&starget->dev);
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(shost);
|
||||
struct _MPT_ADAPTER *ioc = hd->ioc;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
|
||||
dma_addr_t pg1_dma;
|
||||
@@ -847,7 +856,8 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
|
||||
|
||||
pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
|
||||
if (pg1 == NULL) {
|
||||
starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
|
||||
starget_printk(KERN_ERR, starget, MYIOC_s_FMT
|
||||
"dma_alloc_coherent for parameters failed\n", ioc->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -876,7 +886,8 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
|
||||
mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
|
||||
|
||||
if (mpt_config(ioc, &cfg)) {
|
||||
starget_printk(KERN_ERR, starget, "mpt_config failed\n");
|
||||
starget_printk(KERN_ERR, starget, MYIOC_s_FMT
|
||||
"mpt_config failed\n", ioc->name);
|
||||
goto out_free;
|
||||
}
|
||||
err = 0;
|
||||
@@ -1015,7 +1026,7 @@ static void mptspi_write_qas(struct scsi_target *starget, int qas)
|
||||
{
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
|
||||
struct Scsi_Host *shost = dev_to_shost(&starget->dev);
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(shost);
|
||||
VirtTarget *vtarget = starget->hostdata;
|
||||
u32 nego;
|
||||
|
||||
@@ -1067,15 +1078,16 @@ static void mpt_work_wrapper(struct work_struct *work)
|
||||
struct work_queue_wrapper *wqw =
|
||||
container_of(work, struct work_queue_wrapper, work);
|
||||
struct _MPT_SCSI_HOST *hd = wqw->hd;
|
||||
struct Scsi_Host *shost = hd->ioc->sh;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
struct Scsi_Host *shost = ioc->sh;
|
||||
struct scsi_device *sdev;
|
||||
int disk = wqw->disk;
|
||||
struct _CONFIG_PAGE_IOC_3 *pg3;
|
||||
|
||||
kfree(wqw);
|
||||
|
||||
mpt_findImVolumes(hd->ioc);
|
||||
pg3 = hd->ioc->raid_data.pIocPg3;
|
||||
mpt_findImVolumes(ioc);
|
||||
pg3 = ioc->raid_data.pIocPg3;
|
||||
if (!pg3)
|
||||
return;
|
||||
|
||||
@@ -1092,24 +1104,25 @@ static void mpt_work_wrapper(struct work_struct *work)
|
||||
if(vtarget->id != disk)
|
||||
continue;
|
||||
|
||||
starget_printk(KERN_INFO, vtarget->starget,
|
||||
"Integrated RAID requests DV of new device\n");
|
||||
starget_printk(KERN_INFO, vtarget->starget, MYIOC_s_FMT
|
||||
"Integrated RAID requests DV of new device\n", ioc->name);
|
||||
mptspi_dv_device(hd, sdev);
|
||||
}
|
||||
shost_printk(KERN_INFO, shost,
|
||||
"Integrated RAID detects new device %d\n", disk);
|
||||
scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1);
|
||||
shost_printk(KERN_INFO, shost, MYIOC_s_FMT
|
||||
"Integrated RAID detects new device %d\n", ioc->name, disk);
|
||||
scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, 1);
|
||||
}
|
||||
|
||||
|
||||
static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
|
||||
{
|
||||
struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
if (!wqw) {
|
||||
shost_printk(KERN_ERR, hd->ioc->sh,
|
||||
"Failed to act on RAID event for physical disk %d\n",
|
||||
disk);
|
||||
shost_printk(KERN_ERR, ioc->sh, MYIOC_s_FMT
|
||||
"Failed to act on RAID event for physical disk %d\n",
|
||||
ioc->name, disk);
|
||||
return;
|
||||
}
|
||||
INIT_WORK(&wqw->work, mpt_work_wrapper);
|
||||
@@ -1123,7 +1136,7 @@ static int
|
||||
mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
{
|
||||
u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
|
||||
if (hd && event == MPI_EVENT_INTEGRATED_RAID) {
|
||||
int reason
|
||||
@@ -1190,6 +1203,8 @@ static struct spi_function_template mptspi_transport_functions = {
|
||||
static struct pci_device_id mptspi_pci_table[] = {
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{0} /* Terminating entry */
|
||||
@@ -1210,11 +1225,12 @@ mptspi_dv_renegotiate_work(struct work_struct *work)
|
||||
struct scsi_target *starget;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
|
||||
u32 nego;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
kfree(wqw);
|
||||
|
||||
if (hd->spi_pending) {
|
||||
shost_for_each_device(sdev, hd->ioc->sh) {
|
||||
shost_for_each_device(sdev, ioc->sh) {
|
||||
if (hd->spi_pending & (1 << sdev->id))
|
||||
continue;
|
||||
starget = scsi_target(sdev);
|
||||
@@ -1225,7 +1241,7 @@ mptspi_dv_renegotiate_work(struct work_struct *work)
|
||||
mptspi_write_spi_device_pg1(starget, &pg1);
|
||||
}
|
||||
} else {
|
||||
shost_for_each_device(sdev, hd->ioc->sh)
|
||||
shost_for_each_device(sdev, ioc->sh)
|
||||
mptspi_dv_device(hd, sdev);
|
||||
}
|
||||
}
|
||||
@@ -1250,7 +1266,7 @@ mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
|
||||
static int
|
||||
mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
{
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
int rc;
|
||||
|
||||
rc = mptscsih_ioc_reset(ioc, reset_phase);
|
||||
@@ -1269,7 +1285,7 @@ static int
|
||||
mptspi_resume(struct pci_dev *pdev)
|
||||
{
|
||||
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
||||
struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
int rc;
|
||||
|
||||
rc = mptscsih_resume(pdev);
|
||||
@@ -1416,7 +1432,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
if (numSGE < sh->sg_tablesize) {
|
||||
/* Reset this value */
|
||||
dprintk(ioc, printk(MYIOC_s_INFO_FMT
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Resetting sg_tablesize to %d from %d\n",
|
||||
ioc->name, numSGE, sh->sg_tablesize));
|
||||
sh->sg_tablesize = numSGE;
|
||||
@@ -1424,20 +1440,21 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
spin_unlock_irqrestore(&ioc->FreeQlock, flags);
|
||||
|
||||
hd = (MPT_SCSI_HOST *) sh->hostdata;
|
||||
hd = shost_priv(sh);
|
||||
hd->ioc = ioc;
|
||||
|
||||
/* SCSI needs scsi_cmnd lookup table!
|
||||
* (with size equal to req_depth*PtrSz!)
|
||||
*/
|
||||
hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!hd->ScsiLookup) {
|
||||
ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
|
||||
if (!ioc->ScsiLookup) {
|
||||
error = -ENOMEM;
|
||||
goto out_mptspi_probe;
|
||||
}
|
||||
spin_lock_init(&ioc->scsi_lookup_lock);
|
||||
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, hd->ScsiLookup));
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
@@ -1477,13 +1494,13 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
/* Some versions of the firmware don't support page 0; without
|
||||
* that we can't get the parameters */
|
||||
if (hd->ioc->spi_data.sdp0length != 0)
|
||||
if (ioc->spi_data.sdp0length != 0)
|
||||
sh->transportt = mptspi_transport_template;
|
||||
|
||||
error = scsi_add_host (sh, &ioc->pcidev->dev);
|
||||
if(error) {
|
||||
dprintk(ioc, printk(KERN_ERR MYNAM
|
||||
"scsi_add_host failed\n"));
|
||||
dprintk(ioc, printk(MYIOC_s_ERR_FMT
|
||||
"scsi_add_host failed\n", ioc->name));
|
||||
goto out_mptspi_probe;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user