46 #include <linux/module.h>
47 #include <linux/kernel.h>
49 #include <linux/errno.h>
50 #include <linux/kdev_t.h>
54 #include <linux/reboot.h>
57 #include <linux/slab.h>
59 #include <scsi/scsi.h>
70 #define my_NAME "Fusion MPT FC Host driver"
71 #define my_VERSION MPT_LINUX_VERSION_COMMON
80 #define MPTFC_DEV_LOSS_TMO (60)
83 MODULE_PARM_DESC(mptfc_dev_loss_tmo,
" Initial time the driver programs the "
84 " transport to wait for an rport to "
85 " return following a device loss event."
89 #define MPTFC_MAX_LUN (16895)
98 static int mptfc_target_alloc(
struct scsi_target *starget);
99 static int mptfc_slave_alloc(
struct scsi_device *sdev);
101 static void mptfc_target_destroy(
struct scsi_target *starget);
104 static int mptfc_abort(
struct scsi_cmnd *SCpnt);
105 static int mptfc_dev_reset(
struct scsi_cmnd *SCpnt);
106 static int mptfc_bus_reset(
struct scsi_cmnd *SCpnt);
107 static int mptfc_host_reset(
struct scsi_cmnd *SCpnt);
111 .proc_name =
"mptfc",
113 .name =
"MPT FC Host",
115 .queuecommand = mptfc_qcmd,
116 .target_alloc = mptfc_target_alloc,
117 .slave_alloc = mptfc_slave_alloc,
119 .target_destroy = mptfc_target_destroy,
122 .eh_abort_handler = mptfc_abort,
123 .eh_device_reset_handler = mptfc_dev_reset,
124 .eh_bus_reset_handler = mptfc_bus_reset,
125 .eh_host_reset_handler = mptfc_host_reset,
166 .dd_fcrport_size = 8,
167 .show_host_node_name = 1,
168 .show_host_port_name = 1,
169 .show_host_supported_classes = 1,
170 .show_host_port_id = 1,
171 .show_rport_supported_classes = 1,
172 .show_starget_node_name = 1,
173 .show_starget_port_name = 1,
174 .show_starget_port_id = 1,
175 .set_rport_dev_loss_tmo = mptfc_set_rport_loss_tmo,
176 .show_rport_dev_loss_tmo = 1,
177 .show_host_supported_speeds = 1,
178 .show_host_maxframe_size = 1,
179 .show_host_speed = 1,
180 .show_host_fabric_name = 1,
181 .show_host_port_type = 1,
182 .show_host_port_state = 1,
183 .show_host_symbolic_name = 1,
187 mptfc_block_error_handler(
struct scsi_cmnd *SCpnt,
200 hd = shost_priv(SCpnt->
device->host);
203 while ((ready = fc_remote_port_chkready(rport) >> 16) ==
DID_IMM_RETRY
204 || (loops > 0 && ioc->active == 0)) {
205 spin_unlock_irqrestore(shost->
host_lock, flags);
207 "mptfc_block_error_handler.%d: %d:%d, port status is "
208 "%x, active flag %d, deferring %s recovery.\n",
209 ioc->name, ioc->sh->host_no,
211 ready, ioc->active, caller));
216 spin_unlock_irqrestore(shost->
host_lock, flags);
219 || ioc->active == 0) {
221 "%s.%d: %d:%d, failing recovery, "
222 "port state %x, active %d, vdevice %p.\n", caller,
223 ioc->name, ioc->sh->host_no,
225 ioc->active, SCpnt->
device->hostdata));
229 "%s.%d: %d:%d, executing recovery.\n", caller,
230 ioc->name, ioc->sh->host_no,
232 return (*
func)(SCpnt);
257 mptfc_host_reset(
struct scsi_cmnd *SCpnt)
273 mptfc_FcDevPage0_cmp_func(
const void *
a,
const void *
b)
278 if ((*aa)->CurrentBus == (*bb)->CurrentBus) {
279 if ((*aa)->CurrentTargetID == (*bb)->CurrentTargetID)
281 if ((*aa)->CurrentTargetID < (*bb)->CurrentTargetID)
285 if ((*aa)->CurrentBus < (*bb)->CurrentBus)
291 mptfc_GetFcDevPage0(MPT_ADAPTER *ioc,
int ioc_port,
307 int max_bus = ioc->facts.MaxBuses;
310 max_targ = (ioc->facts.MaxDevices == 0) ? 256 : ioc->facts.MaxDevices;
313 p_p0 = p0_array = kzalloc(data_sz,
GFP_KERNEL);
318 p_pp0 = pp0_array = kzalloc(data_sz,
GFP_KERNEL);
328 cfg.cfghdr.hdr = &
hdr;
348 cfg.physAddr = page0_dma;
375 *p_p0 = *ppage0_alloc;
379 (
u8 *) ppage0_alloc, page0_dma);
383 }
while (port_id <= 0xff0000);
389 mptfc_FcDevPage0_cmp_func,
NULL);
391 for (ii = 0; ii < num_targ; ii++) {
392 fc = *(pp0_array+ii);
393 func(ioc, ioc_port, fc);
430 mptfc_register_dev(MPT_ADAPTER *ioc,
int channel,
FCDevicePage0_t *pg0)
434 struct mptfc_rport_info *ri;
440 if (mptfc_generate_rport_ids(pg0, &rport_ids) < 0)
449 pn = (
u64)ri->pg0.WWPN.High << 32 | (
u64)ri->pg0.WWPN.Low;
450 if (pn == rport_ids.port_name) {
451 list_move_tail(&ri->list, &ioc->fc_rports);
457 ri = kzalloc(
sizeof(
struct mptfc_rport_info),
GFP_KERNEL);
464 ri->flags &= ~MPT_RPORT_INFO_FLAGS_MISSING;
467 if (!(ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED)) {
468 ri->flags |= MPT_RPORT_INFO_FLAGS_REGISTERED;
480 vtarget = ri->starget->hostdata;
484 vtarget->deleted = 0;
487 *((
struct mptfc_rport_info **)rport->
dd_data) = ri;
491 pn = (
u64)ri->pg0.WWPN.High << 32 | (
u64)ri->pg0.WWPN.Low;
492 nn = (
u64)ri->pg0.WWNN.High << 32 | (
u64)ri->pg0.WWNN.Low;
494 "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, "
495 "rport tid %d, tmo %d\n",
499 (
unsigned long long)nn,
500 (
unsigned long long)pn,
502 ri->rport->scsi_target_id,
503 ri->rport->dev_loss_tmo));
520 struct mptfc_rport_info *ri;
524 ri = *((
struct mptfc_rport_info **)rport->
dd_data);
543 struct mptfc_rport_info *ri;
546 vtarget = kzalloc(
sizeof(VirtTarget),
GFP_KERNEL);
554 ri = *((
struct mptfc_rport_info **)rport->
dd_data);
556 vtarget->id = ri->pg0.CurrentTargetID;
557 vtarget->channel = ri->pg0.CurrentBus;
558 ri->starget = starget;
581 struct mptfc_rport_info *ri;
583 ri = *((
struct mptfc_rport_info **)rport->
dd_data);
584 pn = (
u64)ri->pg0.WWPN.High << 32 | (
u64)ri->pg0.WWPN.Low;
585 nn = (
u64)ri->pg0.WWNN.High << 32 | (
u64)ri->pg0.WWNN.Low;
587 "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, "
588 "CurrentTargetID %d, %x %llx %llx\n",
592 sdev->
id, ri->pg0.CurrentTargetID,
593 ri->pg0.PortIdentifier,
594 (
unsigned long long)pn,
595 (
unsigned long long)nn));
618 if (!rport || fc_remote_port_chkready(rport))
621 hd = shost_priv(sdev->
host);
624 vdevice = kzalloc(
sizeof(VirtDevice),
GFP_KERNEL);
626 printk(MYIOC_s_ERR_FMT
"slave_alloc kmalloc(%zd) FAILED!\n",
627 ioc->name,
sizeof(VirtDevice));
635 if (vtarget->num_luns == 0) {
636 vtarget->ioc_id = ioc->id;
637 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
640 vdevice->vtarget = vtarget;
641 vdevice->lun = sdev->
lun;
646 mptfc_dump_lun_info(ioc, rport, sdev, vtarget);
654 struct mptfc_rport_info *ri;
657 VirtDevice *vdevice = SCpnt->
device->hostdata;
659 if (!vdevice || !vdevice->vtarget) {
665 err = fc_remote_port_chkready(rport);
673 ri = *((
struct mptfc_rport_info **)rport->
dd_data);
693 mptfc_display_port_link_speed(MPT_ADAPTER *ioc,
int portnum,
FCPortPage0_t *pp0dest)
695 u8 old_speed, new_speed,
state;
701 old_speed = ioc->fc_link_speed[portnum];
702 new_speed = pp0dest->CurrentSpeed;
703 state = pp0dest->PortState;
718 "FC Link Established, Speed = %s\n",
720 else if (old_speed != new_speed)
722 "FC Link Speed Change, Old Speed = %s, New Speed = %s\n",
723 ioc->name, old,
new);
725 ioc->fc_link_speed[portnum] = new_speed;
742 mptfc_GetFcPortPage0(MPT_ADAPTER *ioc,
int portnum)
762 cfg.cfghdr.hdr = &
hdr;
766 cfg.pageAddr = portnum;
781 memset((
u8 *)ppage0_alloc, 0, data_sz);
782 cfg.physAddr = page0_dma;
787 pp0dest = &ioc->fc_port_page0[portnum];
789 memcpy(pp0dest, ppage0_alloc, copy_sz);
824 printk(MYIOC_s_INFO_FMT
"Firmware discovery not"
828 mptfc_display_port_link_speed(ioc, portnum, pp0dest);
838 mptfc_WriteFcPortPage1(MPT_ADAPTER *ioc,
int portnum)
847 if (!(ioc->fc_data.fc_port_page1[portnum].data))
855 cfg.cfghdr.hdr = &
hdr;
859 cfg.pageAddr = portnum;
868 if (hdr.
PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz)
871 cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma;
881 mptfc_GetFcPortPage1(MPT_ADAPTER *ioc,
int portnum)
898 cfg.cfghdr.hdr = &
hdr;
902 cfg.pageAddr = portnum;
913 if (ioc->fc_data.fc_port_page1[portnum].data ==
NULL) {
925 page1_alloc = ioc->fc_data.fc_port_page1[portnum].data;
926 page1_dma = ioc->fc_data.fc_port_page1[portnum].dma;
927 data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz;
929 ioc->fc_data.fc_port_page1[portnum].data =
NULL;
931 page1_alloc, page1_dma);
936 memset(page1_alloc,0,data_sz);
938 cfg.physAddr = page1_dma;
942 ioc->fc_data.fc_port_page1[portnum].data = page1_alloc;
943 ioc->fc_data.fc_port_page1[portnum].pg_sz =
data_sz;
944 ioc->fc_data.fc_port_page1[portnum].dma = page1_dma;
947 ioc->fc_data.fc_port_page1[portnum].data =
NULL;
949 page1_alloc, page1_dma);
956 mptfc_SetFcPortPage1_defaults(MPT_ADAPTER *ioc)
961 #define MPTFC_FW_DEVICE_TIMEOUT (1)
962 #define MPTFC_FW_IO_PEND_TIMEOUT (1)
963 #define ON_FLAGS (MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY)
964 #define OFF_FLAGS (MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS)
966 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) {
967 if (mptfc_GetFcPortPage1(ioc, ii) != 0)
969 pp1 = ioc->fc_data.fc_port_page1[ii].data;
972 && ((pp1->
Flags & ON_FLAGS) == ON_FLAGS)
973 && ((pp1->
Flags & OFF_FLAGS) == 0))
979 mptfc_WriteFcPortPage1(ioc, ii);
985 mptfc_init_host_attr(MPT_ADAPTER *ioc,
int portnum)
1000 pp0 = &ioc->fc_port_page0[portnum];
1007 ioc->facts.FWVersion.Word);
1021 class = pp0->SupportedServiceClass;
1085 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++)
1086 (
void) mptfc_GetFcPortPage0(ioc, ii);
1096 struct mptfc_rport_info *ri;
1098 VirtTarget *vtarget;
1102 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
1103 ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED;
1106 starget = ri->starget;
1110 vtarget->deleted = 1;
1113 pn = (
u64)ri->pg0.WWPN.High << 32 |
1114 (
u64)ri->pg0.WWPN.Low;
1116 "mptfc_setup_reset.%d: %llx deleted\n",
1119 (
unsigned long long)pn));
1131 struct mptfc_rport_info *ri;
1133 VirtTarget *vtarget;
1137 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
1138 ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING;
1146 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1147 (
void) mptfc_GetFcPortPage0(ioc, ii);
1148 mptfc_init_host_attr(ioc, ii);
1149 mptfc_GetFcDevPage0(ioc, ii, mptfc_register_dev);
1155 if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) {
1157 ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED|
1158 MPT_RPORT_INFO_FLAGS_MISSING);
1161 starget = ri->starget;
1165 vtarget->deleted = 1;
1168 pn = (
u64)ri->pg0.WWPN.High << 32 |
1169 (
u64)ri->pg0.WWPN.Low;
1171 "mptfc_rescan.%d: %llx deleted\n",
1174 (
unsigned long long)pn));
1185 unsigned long flags;
1196 ioc = pci_get_drvdata(pdev);
1197 ioc->DoneCtx = mptfcDoneCtx;
1198 ioc->TaskCtx = mptfcTaskCtx;
1199 ioc->InternalCtx = mptfcInternalCtx;
1205 "Skipping because it's not operational!\n",
1208 goto out_mptfc_probe;
1212 printk(MYIOC_s_WARN_FMT
"Skipping because it's disabled!\n",
1215 goto out_mptfc_probe;
1221 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1222 if (ioc->pfacts[ii].ProtocolFlags &
1229 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1238 "Unable to register controller with SCSI subsystem\n",
1241 goto out_mptfc_probe;
1245 INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices);
1246 INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset);
1247 INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change);
1262 sh->
max_id = ioc->pfacts->MaxDevices;
1278 scale = ioc->req_sz/ioc->SGE_size;
1279 if (ioc->sg_addr_size ==
sizeof(
u64)) {
1280 numSGE = (scale - 1) *
1281 (ioc->facts.MaxChainDepth-1) + scale +
1282 (ioc->req_sz - 60) / ioc->SGE_size;
1284 numSGE = 1 + (scale - 1) *
1285 (ioc->facts.MaxChainDepth-1) + scale +
1286 (ioc->req_sz - 64) / ioc->SGE_size;
1292 "Resetting sg_tablesize to %d from %d\n",
1297 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1299 hd = shost_priv(sh);
1305 ioc->ScsiLookup = kcalloc(ioc->req_depth,
sizeof(
void *),
GFP_ATOMIC);
1306 if (!ioc->ScsiLookup) {
1308 goto out_mptfc_probe;
1313 ioc->name, ioc->ScsiLookup));
1315 hd->last_queue_full = 0;
1318 error = scsi_add_host (sh, &ioc->pcidev->dev);
1321 "scsi_add_host failed\n", ioc->name));
1322 goto out_mptfc_probe;
1327 snprintf(ioc->fc_rescan_work_q_name,
sizeof(ioc->fc_rescan_work_q_name),
1329 ioc->fc_rescan_work_q =
1331 if (!ioc->fc_rescan_work_q)
1332 goto out_mptfc_probe;
1338 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1339 (
void) mptfc_GetFcPortPage0(ioc, ii);
1341 mptfc_SetFcPortPage1_defaults(ioc);
1348 queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work);
1361 .id_table = mptfc_pci_table,
1362 .probe = mptfc_probe,
1366 .suspend = mptscsih_suspend,
1367 .resume = mptscsih_resume,
1376 unsigned long flags;
1379 if (ioc->bus_type !=
FC)
1385 if (ioc->sh ==
NULL ||
1386 ((hd = shost_priv(ioc->sh)) ==
NULL))
1392 if (ioc->fc_rescan_work_q) {
1394 &ioc->fc_rescan_work);
1396 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
1400 if (ioc->fc_rescan_work_q) {
1404 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
1414 mptfc_ioc_reset(MPT_ADAPTER *ioc,
int reset_phase)
1417 unsigned long flags;
1420 if ((ioc->bus_type !=
FC) || (!rc))
1425 ": IOC %s_reset routed to FC host driver!\n",ioc->name,
1426 reset_phase==MPT_IOC_SETUP_RESET ?
"setup" : (
1427 reset_phase==MPT_IOC_PRE_RESET ?
"pre" :
"post")));
1429 if (reset_phase == MPT_IOC_SETUP_RESET) {
1431 if (ioc->fc_rescan_work_q) {
1433 &ioc->fc_setup_reset_work);
1435 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
1438 else if (reset_phase == MPT_IOC_PRE_RESET) {
1442 mptfc_SetFcPortPage1_defaults(ioc);
1444 if (ioc->fc_rescan_work_q) {
1446 &ioc->fc_rescan_work);
1448 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
1467 if (mptfc_dev_loss_tmo <= 0)
1470 mptfc_transport_template =
1473 if (!mptfc_transport_template)
1477 "mptscsih_scandv_complete");
1479 "mptscsih_scandv_complete");
1481 "mptscsih_scandv_complete");
1486 error = pci_register_driver(&mptfc_driver);
1500 mptfc_remove(
struct pci_dev *pdev)
1502 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
1503 struct mptfc_rport_info *
p, *
n;
1505 unsigned long flags;
1509 if ((work_q=ioc->fc_rescan_work_q)) {
1511 ioc->fc_rescan_work_q =
NULL;
1512 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
1523 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) {
1524 if (ioc->fc_data.fc_port_page1[ii].data) {
1526 ioc->fc_data.fc_port_page1[ii].pg_sz,
1527 (
u8 *) ioc->fc_data.fc_port_page1[ii].data,
1528 ioc->fc_data.fc_port_page1[ii].dma);
1529 ioc->fc_data.fc_port_page1[ii].data =
NULL;