Lines Matching +full:low +full:- +full:speed

6  *  Copyright (c) 1999-2008 LSI Corporation
7 * (mailto:DL-MPTFusionLinux@lsi.com)
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
24 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
43 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
69 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
88 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
128 .this_id = -1,
196 ioc = hd->ioc; in mptfc_block_error_handler()
197 spin_lock_irqsave(shost->host_lock, flags); in mptfc_block_error_handler()
199 || (loops > 0 && ioc->active == 0)) { in mptfc_block_error_handler()
200 spin_unlock_irqrestore(shost->host_lock, flags); in mptfc_block_error_handler()
204 ioc->name, ioc->sh->host_no, in mptfc_block_error_handler()
205 dev_name(&rport->dev), ready, ioc->active)); in mptfc_block_error_handler()
207 spin_lock_irqsave(shost->host_lock, flags); in mptfc_block_error_handler()
208 loops --; in mptfc_block_error_handler()
210 spin_unlock_irqrestore(shost->host_lock, flags); in mptfc_block_error_handler()
212 if (ready == DID_NO_CONNECT || ioc->active == 0) { in mptfc_block_error_handler()
216 ioc->name, ioc->sh->host_no, in mptfc_block_error_handler()
217 dev_name(&rport->dev), ready, ioc->active)); in mptfc_block_error_handler()
226 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_abort()
227 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_abort()
233 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_abort()
235 hd->ioc->name, shost->host_no, in mptfc_abort()
236 SCpnt->device->id, SCpnt->device->lun)); in mptfc_abort()
245 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_dev_reset()
246 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_dev_reset()
252 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_dev_reset()
254 hd->ioc->name, shost->host_no, in mptfc_dev_reset()
255 SCpnt->device->id, SCpnt->device->lun)); in mptfc_dev_reset()
264 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_bus_reset()
266 int channel = SCpnt->device->channel; in mptfc_bus_reset()
270 list_for_each_entry(ri, &hd->ioc->fc_rports, list) { in mptfc_bus_reset()
271 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_bus_reset()
272 VirtTarget *vtarget = ri->starget->hostdata; in mptfc_bus_reset()
274 if (!vtarget || vtarget->channel != channel) in mptfc_bus_reset()
276 rtn = fc_block_rport(ri->rport); in mptfc_bus_reset()
282 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_bus_reset()
284 hd->ioc->name, shost->host_no, in mptfc_bus_reset()
285 SCpnt->device->id, SCpnt->device->lun)); in mptfc_bus_reset()
295 rport->dev_loss_tmo = timeout; in mptfc_set_rport_loss_tmo()
297 rport->dev_loss_tmo = mptfc_dev_loss_tmo; in mptfc_set_rport_loss_tmo()
306 if ((*aa)->CurrentBus == (*bb)->CurrentBus) { in mptfc_FcDevPage0_cmp_func()
307 if ((*aa)->CurrentTargetID == (*bb)->CurrentTargetID) in mptfc_FcDevPage0_cmp_func()
309 if ((*aa)->CurrentTargetID < (*bb)->CurrentTargetID) in mptfc_FcDevPage0_cmp_func()
310 return -1; in mptfc_FcDevPage0_cmp_func()
313 if ((*aa)->CurrentBus < (*bb)->CurrentBus) in mptfc_FcDevPage0_cmp_func()
314 return -1; in mptfc_FcDevPage0_cmp_func()
332 int rc = -ENOMEM; in mptfc_GetFcDevPage0()
335 int max_bus = ioc->facts.MaxBuses; in mptfc_GetFcDevPage0()
338 max_targ = (ioc->facts.MaxDevices == 0) ? 256 : ioc->facts.MaxDevices; in mptfc_GetFcDevPage0()
357 cfg.physAddr = -1; in mptfc_GetFcDevPage0()
370 ppage0_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcDevPage0()
372 rc = -ENOMEM; in mptfc_GetFcDevPage0()
380 ppage0_alloc->PortIdentifier = in mptfc_GetFcDevPage0()
381 le32_to_cpu(ppage0_alloc->PortIdentifier); in mptfc_GetFcDevPage0()
383 ppage0_alloc->WWNN.Low = in mptfc_GetFcDevPage0()
384 le32_to_cpu(ppage0_alloc->WWNN.Low); in mptfc_GetFcDevPage0()
386 ppage0_alloc->WWNN.High = in mptfc_GetFcDevPage0()
387 le32_to_cpu(ppage0_alloc->WWNN.High); in mptfc_GetFcDevPage0()
389 ppage0_alloc->WWPN.Low = in mptfc_GetFcDevPage0()
390 le32_to_cpu(ppage0_alloc->WWPN.Low); in mptfc_GetFcDevPage0()
392 ppage0_alloc->WWPN.High = in mptfc_GetFcDevPage0()
393 le32_to_cpu(ppage0_alloc->WWPN.High); in mptfc_GetFcDevPage0()
395 ppage0_alloc->BBCredit = in mptfc_GetFcDevPage0()
396 le16_to_cpu(ppage0_alloc->BBCredit); in mptfc_GetFcDevPage0()
398 ppage0_alloc->MaxRxFrameSize = in mptfc_GetFcDevPage0()
399 le16_to_cpu(ppage0_alloc->MaxRxFrameSize); in mptfc_GetFcDevPage0()
401 port_id = ppage0_alloc->PortIdentifier; in mptfc_GetFcDevPage0()
406 dma_free_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcDevPage0()
435 if (pg0->Flags & (MPI_FC_DEVICE_PAGE0_FLAGS_PLOGI_INVALID | in mptfc_generate_rport_ids()
437 return -1; in mptfc_generate_rport_ids()
439 if (!(pg0->Flags & MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID)) in mptfc_generate_rport_ids()
440 return -1; in mptfc_generate_rport_ids()
442 if (!(pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET)) in mptfc_generate_rport_ids()
443 return -1; in mptfc_generate_rport_ids()
449 rid->node_name = ((u64)pg0->WWNN.High) << 32 | (u64)pg0->WWNN.Low; in mptfc_generate_rport_ids()
450 rid->port_name = ((u64)pg0->WWPN.High) << 32 | (u64)pg0->WWPN.Low; in mptfc_generate_rport_ids()
451 rid->port_id = pg0->PortIdentifier; in mptfc_generate_rport_ids()
452 rid->roles = FC_RPORT_ROLE_UNKNOWN; in mptfc_generate_rport_ids()
472 if (pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) in mptfc_register_dev()
476 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_register_dev()
477 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_register_dev()
479 list_move_tail(&ri->list, &ioc->fc_rports); in mptfc_register_dev()
488 list_add_tail(&ri->list, &ioc->fc_rports); in mptfc_register_dev()
491 ri->pg0 = *pg0; /* add/update pg0 data */ in mptfc_register_dev()
492 ri->flags &= ~MPT_RPORT_INFO_FLAGS_MISSING; in mptfc_register_dev()
494 /* MPT_RPORT_INFO_FLAGS_REGISTERED - rport not previously deleted */ in mptfc_register_dev()
495 if (!(ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED)) { in mptfc_register_dev()
496 ri->flags |= MPT_RPORT_INFO_FLAGS_REGISTERED; in mptfc_register_dev()
497 rport = fc_remote_port_add(ioc->sh, channel, &rport_ids); in mptfc_register_dev()
499 ri->rport = rport; in mptfc_register_dev()
501 rport->dev_loss_tmo = mptfc_dev_loss_tmo; in mptfc_register_dev()
507 if (ri->starget) { in mptfc_register_dev()
508 vtarget = ri->starget->hostdata; in mptfc_register_dev()
510 vtarget->id = pg0->CurrentTargetID; in mptfc_register_dev()
511 vtarget->channel = pg0->CurrentBus; in mptfc_register_dev()
512 vtarget->deleted = 0; in mptfc_register_dev()
515 *((struct mptfc_rport_info **)rport->dd_data) = ri; in mptfc_register_dev()
519 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_register_dev()
520 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; in mptfc_register_dev()
524 ioc->name, in mptfc_register_dev()
525 ioc->sh->host_no, in mptfc_register_dev()
526 pg0->PortIdentifier, in mptfc_register_dev()
529 pg0->CurrentTargetID, in mptfc_register_dev()
530 ri->rport->scsi_target_id, in mptfc_register_dev()
531 ri->rport->dev_loss_tmo)); in mptfc_register_dev()
533 list_del(&ri->list); in mptfc_register_dev()
552 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_target_destroy()
554 ri->starget = NULL; in mptfc_target_destroy()
556 kfree(starget->hostdata); in mptfc_target_destroy()
557 starget->hostdata = NULL; in mptfc_target_destroy()
563 * Return non-zero if allocation fails.
575 return -ENOMEM; in mptfc_target_alloc()
576 starget->hostdata = vtarget; in mptfc_target_alloc()
578 rc = -ENODEV; in mptfc_target_alloc()
581 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_target_alloc()
583 vtarget->id = ri->pg0.CurrentTargetID; in mptfc_target_alloc()
584 vtarget->channel = ri->pg0.CurrentBus; in mptfc_target_alloc()
585 ri->starget = starget; in mptfc_target_alloc()
591 starget->hostdata = NULL; in mptfc_target_alloc()
610 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_dump_lun_info()
611 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_dump_lun_info()
612 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; in mptfc_dump_lun_info()
616 ioc->name, in mptfc_dump_lun_info()
617 sdev->host->host_no, in mptfc_dump_lun_info()
618 vtarget->num_luns, in mptfc_dump_lun_info()
619 sdev->id, ri->pg0.CurrentTargetID, in mptfc_dump_lun_info()
620 ri->pg0.PortIdentifier, in mptfc_dump_lun_info()
629 * Return non-zero if allocation fails.
646 return -ENXIO; in mptfc_slave_alloc()
648 hd = shost_priv(sdev->host); in mptfc_slave_alloc()
649 ioc = hd->ioc; in mptfc_slave_alloc()
654 ioc->name, sizeof(VirtDevice)); in mptfc_slave_alloc()
655 return -ENOMEM; in mptfc_slave_alloc()
659 sdev->hostdata = vdevice; in mptfc_slave_alloc()
660 vtarget = starget->hostdata; in mptfc_slave_alloc()
662 if (vtarget->num_luns == 0) { in mptfc_slave_alloc()
663 vtarget->ioc_id = ioc->id; in mptfc_slave_alloc()
664 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES; in mptfc_slave_alloc()
667 vdevice->vtarget = vtarget; in mptfc_slave_alloc()
668 vdevice->lun = sdev->lun; in mptfc_slave_alloc()
670 vtarget->num_luns++; in mptfc_slave_alloc()
682 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_qcmd()
684 VirtDevice *vdevice = SCpnt->device->hostdata; in mptfc_qcmd()
686 if (!vdevice || !vdevice->vtarget) { in mptfc_qcmd()
687 SCpnt->result = DID_NO_CONNECT << 16; in mptfc_qcmd()
694 SCpnt->result = err; in mptfc_qcmd()
700 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_qcmd()
702 SCpnt->result = DID_IMM_RETRY << 16; in mptfc_qcmd()
711 * mptfc_display_port_link_speed - displaying link speed
726 old_speed = ioc->fc_link_speed[portnum]; in mptfc_display_port_link_speed()
727 new_speed = pp0dest->CurrentSpeed; in mptfc_display_port_link_speed()
728 state = pp0dest->PortState; in mptfc_display_port_link_speed()
743 "FC Link Established, Speed = %s\n", in mptfc_display_port_link_speed()
744 ioc->name, new); in mptfc_display_port_link_speed()
747 "FC Link Speed Change, Old Speed = %s, New Speed = %s\n", in mptfc_display_port_link_speed()
748 ioc->name, old, new); in mptfc_display_port_link_speed()
750 ioc->fc_link_speed[portnum] = new_speed; in mptfc_display_port_link_speed()
755 * mptfc_GetFcPortPage0 - Fetch FCPort config Page0.
760 * -ENOMEM if no memory available
761 * -EPERM if not allowed due to ISR context
762 * -EAGAIN if no msg frames currently available
763 * -EFAULT for non-successful reply or no reply (timeout)
764 * -EINVAL portnum arg out of range (hardwired to two elements)
780 return -EINVAL; in mptfc_GetFcPortPage0()
788 cfg.physAddr = -1; in mptfc_GetFcPortPage0()
801 rc = -ENOMEM; in mptfc_GetFcPortPage0()
802 ppage0_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage0()
813 pp0dest = &ioc->fc_port_page0[portnum]; in mptfc_GetFcPortPage0()
819 * by byte-swapping all > 1 byte fields! in mptfc_GetFcPortPage0()
821 pp0dest->Flags = le32_to_cpu(pp0dest->Flags); in mptfc_GetFcPortPage0()
822 pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); in mptfc_GetFcPortPage0()
823 pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); in mptfc_GetFcPortPage0()
824 pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); in mptfc_GetFcPortPage0()
825 pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); in mptfc_GetFcPortPage0()
826 pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); in mptfc_GetFcPortPage0()
827 pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); in mptfc_GetFcPortPage0()
828 pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); in mptfc_GetFcPortPage0()
829 pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); in mptfc_GetFcPortPage0()
830 pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); in mptfc_GetFcPortPage0()
831 pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); in mptfc_GetFcPortPage0()
832 pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); in mptfc_GetFcPortPage0()
833 pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); in mptfc_GetFcPortPage0()
834 pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); in mptfc_GetFcPortPage0()
835 pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); in mptfc_GetFcPortPage0()
836 pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); in mptfc_GetFcPortPage0()
842 if ((pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) || in mptfc_GetFcPortPage0()
843 (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE && in mptfc_GetFcPortPage0()
844 (pp0dest->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK) in mptfc_GetFcPortPage0()
846 if (count-- > 0) { in mptfc_GetFcPortPage0()
852 ioc->name); in mptfc_GetFcPortPage0()
857 dma_free_coherent(&ioc->pcidev->dev, data_sz, ppage0_alloc, in mptfc_GetFcPortPage0()
872 return -EINVAL; in mptfc_WriteFcPortPage1()
874 if (!(ioc->fc_data.fc_port_page1[portnum].data)) in mptfc_WriteFcPortPage1()
875 return -EINVAL; in mptfc_WriteFcPortPage1()
883 cfg.physAddr = -1; in mptfc_WriteFcPortPage1()
893 return -ENODEV; in mptfc_WriteFcPortPage1()
895 if (hdr.PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz) in mptfc_WriteFcPortPage1()
896 return -EINVAL; in mptfc_WriteFcPortPage1()
898 cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma; in mptfc_WriteFcPortPage1()
918 return -EINVAL; in mptfc_GetFcPortPage1()
926 cfg.physAddr = -1; in mptfc_GetFcPortPage1()
936 return -ENODEV; in mptfc_GetFcPortPage1()
940 if (ioc->fc_data.fc_port_page1[portnum].data == NULL) { in mptfc_GetFcPortPage1()
945 page1_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage1()
948 return -ENOMEM; in mptfc_GetFcPortPage1()
951 page1_alloc = ioc->fc_data.fc_port_page1[portnum].data; in mptfc_GetFcPortPage1()
952 page1_dma = ioc->fc_data.fc_port_page1[portnum].dma; in mptfc_GetFcPortPage1()
953 data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz; in mptfc_GetFcPortPage1()
955 ioc->fc_data.fc_port_page1[portnum].data = NULL; in mptfc_GetFcPortPage1()
956 dma_free_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage1()
966 ioc->fc_data.fc_port_page1[portnum].data = page1_alloc; in mptfc_GetFcPortPage1()
967 ioc->fc_data.fc_port_page1[portnum].pg_sz = data_sz; in mptfc_GetFcPortPage1()
968 ioc->fc_data.fc_port_page1[portnum].dma = page1_dma; in mptfc_GetFcPortPage1()
971 ioc->fc_data.fc_port_page1[portnum].data = NULL; in mptfc_GetFcPortPage1()
972 dma_free_coherent(&ioc->pcidev->dev, data_sz, page1_alloc, in mptfc_GetFcPortPage1()
990 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { in mptfc_SetFcPortPage1_defaults()
993 pp1 = ioc->fc_data.fc_port_page1[ii].data; in mptfc_SetFcPortPage1_defaults()
994 if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT) in mptfc_SetFcPortPage1_defaults()
995 && (pp1->InitiatorIoPendTimeout == MPTFC_FW_IO_PEND_TIMEOUT) in mptfc_SetFcPortPage1_defaults()
996 && ((pp1->Flags & ON_FLAGS) == ON_FLAGS) in mptfc_SetFcPortPage1_defaults()
997 && ((pp1->Flags & OFF_FLAGS) == 0)) in mptfc_SetFcPortPage1_defaults()
999 pp1->InitiatorDeviceTimeout = MPTFC_FW_DEVICE_TIMEOUT; in mptfc_SetFcPortPage1_defaults()
1000 pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT; in mptfc_SetFcPortPage1_defaults()
1001 pp1->Flags &= ~OFF_FLAGS; in mptfc_SetFcPortPage1_defaults()
1002 pp1->Flags |= ON_FLAGS; in mptfc_SetFcPortPage1_defaults()
1013 unsigned speed; in mptfc_init_host_attr() local
1024 pp0 = &ioc->fc_port_page0[portnum]; in mptfc_init_host_attr()
1025 sh = ioc->sh; in mptfc_init_host_attr()
1029 ioc->prod_name, in mptfc_init_host_attr()
1031 ioc->facts.FWVersion.Word); in mptfc_init_host_attr()
1035 fc_host_maxframe_size(sh) = pp0->MaxFrameSize; in mptfc_init_host_attr()
1038 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; in mptfc_init_host_attr()
1041 (u64)pp0->WWPN.High << 32 | (u64)pp0->WWPN.Low; in mptfc_init_host_attr()
1043 fc_host_port_id(sh) = pp0->PortIdentifier; in mptfc_init_host_attr()
1045 class = pp0->SupportedServiceClass; in mptfc_init_host_attr()
1054 if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT) in mptfc_init_host_attr()
1055 speed = FC_PORTSPEED_1GBIT; in mptfc_init_host_attr()
1056 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT) in mptfc_init_host_attr()
1057 speed = FC_PORTSPEED_2GBIT; in mptfc_init_host_attr()
1058 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT) in mptfc_init_host_attr()
1059 speed = FC_PORTSPEED_4GBIT; in mptfc_init_host_attr()
1060 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT) in mptfc_init_host_attr()
1061 speed = FC_PORTSPEED_10GBIT; in mptfc_init_host_attr()
1063 speed = FC_PORTSPEED_UNKNOWN; in mptfc_init_host_attr()
1064 fc_host_speed(sh) = speed; in mptfc_init_host_attr()
1066 speed = 0; in mptfc_init_host_attr()
1067 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED) in mptfc_init_host_attr()
1068 speed |= FC_PORTSPEED_1GBIT; in mptfc_init_host_attr()
1069 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED) in mptfc_init_host_attr()
1070 speed |= FC_PORTSPEED_2GBIT; in mptfc_init_host_attr()
1071 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED) in mptfc_init_host_attr()
1072 speed |= FC_PORTSPEED_4GBIT; in mptfc_init_host_attr()
1073 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED) in mptfc_init_host_attr()
1074 speed |= FC_PORTSPEED_10GBIT; in mptfc_init_host_attr()
1075 fc_host_supported_speeds(sh) = speed; in mptfc_init_host_attr()
1078 if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE) in mptfc_init_host_attr()
1080 else if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_OFFLINE) in mptfc_init_host_attr()
1085 if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT) in mptfc_init_host_attr()
1087 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP) in mptfc_init_host_attr()
1089 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP) in mptfc_init_host_attr()
1091 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT) in mptfc_init_host_attr()
1096 (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_FABRIC_WWN_VALID) ? in mptfc_init_host_attr()
1097 (u64) pp0->FabricWWNN.High << 32 | (u64) pp0->FabricWWPN.Low : in mptfc_init_host_attr()
1098 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; in mptfc_init_host_attr()
1109 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) in mptfc_link_status_change()
1125 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_setup_reset()
1126 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_setup_reset()
1127 ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED; in mptfc_setup_reset()
1128 fc_remote_port_delete(ri->rport); /* won't sleep */ in mptfc_setup_reset()
1129 ri->rport = NULL; in mptfc_setup_reset()
1130 starget = ri->starget; in mptfc_setup_reset()
1132 vtarget = starget->hostdata; in mptfc_setup_reset()
1134 vtarget->deleted = 1; in mptfc_setup_reset()
1137 pn = (u64)ri->pg0.WWPN.High << 32 | in mptfc_setup_reset()
1138 (u64)ri->pg0.WWPN.Low; in mptfc_setup_reset()
1141 ioc->name, in mptfc_setup_reset()
1142 ioc->sh->host_no, in mptfc_setup_reset()
1160 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_rescan_devices()
1161 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_rescan_devices()
1162 ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING; in mptfc_rescan_devices()
1170 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_rescan_devices()
1177 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_rescan_devices()
1179 if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) { in mptfc_rescan_devices()
1181 ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED| in mptfc_rescan_devices()
1183 fc_remote_port_delete(ri->rport); /* won't sleep */ in mptfc_rescan_devices()
1184 ri->rport = NULL; in mptfc_rescan_devices()
1185 starget = ri->starget; in mptfc_rescan_devices()
1187 vtarget = starget->hostdata; in mptfc_rescan_devices()
1189 vtarget->deleted = 1; in mptfc_rescan_devices()
1192 pn = (u64)ri->pg0.WWPN.High << 32 | in mptfc_rescan_devices()
1193 (u64)ri->pg0.WWPN.Low; in mptfc_rescan_devices()
1196 ioc->name, in mptfc_rescan_devices()
1197 ioc->sh->host_no, in mptfc_rescan_devices()
1221 ioc->DoneCtx = mptfcDoneCtx; in mptfc_probe()
1222 ioc->TaskCtx = mptfcTaskCtx; in mptfc_probe()
1223 ioc->InternalCtx = mptfcInternalCtx; in mptfc_probe()
1227 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) { in mptfc_probe()
1230 ioc->name); in mptfc_probe()
1231 error = -ENODEV; in mptfc_probe()
1235 if (!ioc->active) { in mptfc_probe()
1237 ioc->name); in mptfc_probe()
1238 error = -ENODEV; in mptfc_probe()
1242 /* Sanity check - ensure at least 1 port is INITIATOR capable in mptfc_probe()
1245 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_probe()
1246 if (ioc->pfacts[ii].ProtocolFlags & in mptfc_probe()
1254 ioc->name, ioc); in mptfc_probe()
1263 ioc->name); in mptfc_probe()
1264 error = -1; in mptfc_probe()
1268 spin_lock_init(&ioc->fc_rescan_work_lock); in mptfc_probe()
1269 INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); in mptfc_probe()
1270 INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); in mptfc_probe()
1271 INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change); in mptfc_probe()
1273 spin_lock_irqsave(&ioc->FreeQlock, flags); in mptfc_probe()
1277 ioc->sh = sh; in mptfc_probe()
1279 sh->io_port = 0; in mptfc_probe()
1280 sh->n_io_port = 0; in mptfc_probe()
1281 sh->irq = 0; in mptfc_probe()
1284 sh->max_cmd_len = 16; in mptfc_probe()
1286 sh->max_id = ioc->pfacts->MaxDevices; in mptfc_probe()
1287 sh->max_lun = max_lun; in mptfc_probe()
1291 sh->unique_id = ioc->id; in mptfc_probe()
1297 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ in mptfc_probe()
1298 * + (req_sz - 64)/sizeof(SGE) in mptfc_probe()
1302 scale = ioc->req_sz/ioc->SGE_size; in mptfc_probe()
1303 if (ioc->sg_addr_size == sizeof(u64)) { in mptfc_probe()
1304 numSGE = (scale - 1) * in mptfc_probe()
1305 (ioc->facts.MaxChainDepth-1) + scale + in mptfc_probe()
1306 (ioc->req_sz - 60) / ioc->SGE_size; in mptfc_probe()
1308 numSGE = 1 + (scale - 1) * in mptfc_probe()
1309 (ioc->facts.MaxChainDepth-1) + scale + in mptfc_probe()
1310 (ioc->req_sz - 64) / ioc->SGE_size; in mptfc_probe()
1313 if (numSGE < sh->sg_tablesize) { in mptfc_probe()
1317 ioc->name, numSGE, sh->sg_tablesize)); in mptfc_probe()
1318 sh->sg_tablesize = numSGE; in mptfc_probe()
1321 spin_unlock_irqrestore(&ioc->FreeQlock, flags); in mptfc_probe()
1324 hd->ioc = ioc; in mptfc_probe()
1329 ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_KERNEL); in mptfc_probe()
1330 if (!ioc->ScsiLookup) { in mptfc_probe()
1331 error = -ENOMEM; in mptfc_probe()
1334 spin_lock_init(&ioc->scsi_lookup_lock); in mptfc_probe()
1337 ioc->name, ioc->ScsiLookup)); in mptfc_probe()
1339 hd->last_queue_full = 0; in mptfc_probe()
1341 sh->transportt = mptfc_transport_template; in mptfc_probe()
1342 error = scsi_add_host (sh, &ioc->pcidev->dev); in mptfc_probe()
1345 "scsi_add_host failed\n", ioc->name)); in mptfc_probe()
1351 snprintf(ioc->fc_rescan_work_q_name, sizeof(ioc->fc_rescan_work_q_name), in mptfc_probe()
1352 "mptfc_wq_%d", sh->host_no); in mptfc_probe()
1353 ioc->fc_rescan_work_q = in mptfc_probe()
1354 alloc_ordered_workqueue(ioc->fc_rescan_work_q_name, in mptfc_probe()
1356 if (!ioc->fc_rescan_work_q) { in mptfc_probe()
1357 error = -ENOMEM; in mptfc_probe()
1362 * Pre-fetch FC port WWN and stuff... in mptfc_probe()
1365 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_probe()
1371 * scan for rports - in mptfc_probe()
1375 queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work); in mptfc_probe()
1376 flush_workqueue(ioc->fc_rescan_work_q); in mptfc_probe()
1405 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; in mptfc_event_process()
1409 if (ioc->bus_type != FC) in mptfc_event_process()
1413 ioc->name, event)); in mptfc_event_process()
1415 if (ioc->sh == NULL || in mptfc_event_process()
1416 ((hd = shost_priv(ioc->sh)) == NULL)) in mptfc_event_process()
1421 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1422 if (ioc->fc_rescan_work_q) { in mptfc_event_process()
1423 queue_work(ioc->fc_rescan_work_q, in mptfc_event_process()
1424 &ioc->fc_rescan_work); in mptfc_event_process()
1426 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1429 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1430 if (ioc->fc_rescan_work_q) { in mptfc_event_process()
1431 queue_work(ioc->fc_rescan_work_q, in mptfc_event_process()
1432 &ioc->fc_lsc_work); in mptfc_event_process()
1434 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1450 if ((ioc->bus_type != FC) || (!rc)) in mptfc_ioc_reset()
1455 ": IOC %s_reset routed to FC host driver!\n",ioc->name, in mptfc_ioc_reset()
1460 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1461 if (ioc->fc_rescan_work_q) { in mptfc_ioc_reset()
1462 queue_work(ioc->fc_rescan_work_q, in mptfc_ioc_reset()
1463 &ioc->fc_setup_reset_work); in mptfc_ioc_reset()
1465 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1473 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1474 if (ioc->fc_rescan_work_q) { in mptfc_ioc_reset()
1475 queue_work(ioc->fc_rescan_work_q, in mptfc_ioc_reset()
1476 &ioc->fc_rescan_work); in mptfc_ioc_reset()
1478 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1483 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1485 * mptfc_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1487 * Returns 0 for success, non-zero for failure.
1504 return -ENODEV; in mptfc_init()
1523 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1525 * mptfc_remove - Remove fc infrastructure for devices
1538 if ((work_q=ioc->fc_rescan_work_q)) { in mptfc_remove()
1539 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_remove()
1540 ioc->fc_rescan_work_q = NULL; in mptfc_remove()
1541 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_remove()
1545 fc_remove_host(ioc->sh); in mptfc_remove()
1547 list_for_each_entry_safe(p, n, &ioc->fc_rports, list) { in mptfc_remove()
1548 list_del(&p->list); in mptfc_remove()
1552 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { in mptfc_remove()
1553 if (ioc->fc_data.fc_port_page1[ii].data) { in mptfc_remove()
1554 dma_free_coherent(&ioc->pcidev->dev, in mptfc_remove()
1555 ioc->fc_data.fc_port_page1[ii].pg_sz, in mptfc_remove()
1556 ioc->fc_data.fc_port_page1[ii].data, in mptfc_remove()
1557 ioc->fc_data.fc_port_page1[ii].dma); in mptfc_remove()
1558 ioc->fc_data.fc_port_page1[ii].data = NULL; in mptfc_remove()
1562 scsi_remove_host(ioc->sh); in mptfc_remove()
1567 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1568 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1570 * mptfc_exit - Unregisters MPT adapter(s)