Lines Matching +full:high +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,
197 ioc = hd->ioc; in mptfc_block_error_handler()
198 spin_lock_irqsave(shost->host_lock, flags); in mptfc_block_error_handler()
200 || (loops > 0 && ioc->active == 0)) { in mptfc_block_error_handler()
201 spin_unlock_irqrestore(shost->host_lock, flags); in mptfc_block_error_handler()
205 ioc->name, ioc->sh->host_no, in mptfc_block_error_handler()
206 dev_name(&rport->dev), ready, ioc->active)); in mptfc_block_error_handler()
208 spin_lock_irqsave(shost->host_lock, flags); in mptfc_block_error_handler()
209 loops --; in mptfc_block_error_handler()
211 spin_unlock_irqrestore(shost->host_lock, flags); in mptfc_block_error_handler()
213 if (ready == DID_NO_CONNECT || ioc->active == 0) { in mptfc_block_error_handler()
217 ioc->name, ioc->sh->host_no, in mptfc_block_error_handler()
218 dev_name(&rport->dev), ready, ioc->active)); in mptfc_block_error_handler()
227 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_abort()
228 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_abort()
234 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_abort()
236 hd->ioc->name, shost->host_no, in mptfc_abort()
237 SCpnt->device->id, SCpnt->device->lun)); in mptfc_abort()
246 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_dev_reset()
247 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_dev_reset()
253 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_dev_reset()
255 hd->ioc->name, shost->host_no, in mptfc_dev_reset()
256 SCpnt->device->id, SCpnt->device->lun)); in mptfc_dev_reset()
265 struct Scsi_Host *shost = SCpnt->device->host; in mptfc_bus_reset()
267 int channel = SCpnt->device->channel; in mptfc_bus_reset()
271 list_for_each_entry(ri, &hd->ioc->fc_rports, list) { in mptfc_bus_reset()
272 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_bus_reset()
273 VirtTarget *vtarget = ri->starget->hostdata; in mptfc_bus_reset()
275 if (!vtarget || vtarget->channel != channel) in mptfc_bus_reset()
277 rtn = fc_block_rport(ri->rport); in mptfc_bus_reset()
283 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT in mptfc_bus_reset()
285 hd->ioc->name, shost->host_no, in mptfc_bus_reset()
286 SCpnt->device->id, SCpnt->device->lun)); in mptfc_bus_reset()
296 rport->dev_loss_tmo = timeout; in mptfc_set_rport_loss_tmo()
298 rport->dev_loss_tmo = mptfc_dev_loss_tmo; in mptfc_set_rport_loss_tmo()
307 if ((*aa)->CurrentBus == (*bb)->CurrentBus) { in mptfc_FcDevPage0_cmp_func()
308 if ((*aa)->CurrentTargetID == (*bb)->CurrentTargetID) in mptfc_FcDevPage0_cmp_func()
310 if ((*aa)->CurrentTargetID < (*bb)->CurrentTargetID) in mptfc_FcDevPage0_cmp_func()
311 return -1; in mptfc_FcDevPage0_cmp_func()
314 if ((*aa)->CurrentBus < (*bb)->CurrentBus) in mptfc_FcDevPage0_cmp_func()
315 return -1; in mptfc_FcDevPage0_cmp_func()
333 int rc = -ENOMEM; in mptfc_GetFcDevPage0()
336 int max_bus = ioc->facts.MaxBuses; in mptfc_GetFcDevPage0()
339 max_targ = (ioc->facts.MaxDevices == 0) ? 256 : ioc->facts.MaxDevices; in mptfc_GetFcDevPage0()
358 cfg.physAddr = -1; in mptfc_GetFcDevPage0()
371 ppage0_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcDevPage0()
373 rc = -ENOMEM; in mptfc_GetFcDevPage0()
381 ppage0_alloc->PortIdentifier = in mptfc_GetFcDevPage0()
382 le32_to_cpu(ppage0_alloc->PortIdentifier); in mptfc_GetFcDevPage0()
384 ppage0_alloc->WWNN.Low = in mptfc_GetFcDevPage0()
385 le32_to_cpu(ppage0_alloc->WWNN.Low); in mptfc_GetFcDevPage0()
387 ppage0_alloc->WWNN.High = in mptfc_GetFcDevPage0()
388 le32_to_cpu(ppage0_alloc->WWNN.High); in mptfc_GetFcDevPage0()
390 ppage0_alloc->WWPN.Low = in mptfc_GetFcDevPage0()
391 le32_to_cpu(ppage0_alloc->WWPN.Low); in mptfc_GetFcDevPage0()
393 ppage0_alloc->WWPN.High = in mptfc_GetFcDevPage0()
394 le32_to_cpu(ppage0_alloc->WWPN.High); in mptfc_GetFcDevPage0()
396 ppage0_alloc->BBCredit = in mptfc_GetFcDevPage0()
397 le16_to_cpu(ppage0_alloc->BBCredit); in mptfc_GetFcDevPage0()
399 ppage0_alloc->MaxRxFrameSize = in mptfc_GetFcDevPage0()
400 le16_to_cpu(ppage0_alloc->MaxRxFrameSize); in mptfc_GetFcDevPage0()
402 port_id = ppage0_alloc->PortIdentifier; in mptfc_GetFcDevPage0()
407 dma_free_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcDevPage0()
436 if (pg0->Flags & (MPI_FC_DEVICE_PAGE0_FLAGS_PLOGI_INVALID | in mptfc_generate_rport_ids()
438 return -1; in mptfc_generate_rport_ids()
440 if (!(pg0->Flags & MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID)) in mptfc_generate_rport_ids()
441 return -1; in mptfc_generate_rport_ids()
443 if (!(pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET)) in mptfc_generate_rport_ids()
444 return -1; in mptfc_generate_rport_ids()
450 rid->node_name = ((u64)pg0->WWNN.High) << 32 | (u64)pg0->WWNN.Low; in mptfc_generate_rport_ids()
451 rid->port_name = ((u64)pg0->WWPN.High) << 32 | (u64)pg0->WWPN.Low; in mptfc_generate_rport_ids()
452 rid->port_id = pg0->PortIdentifier; in mptfc_generate_rport_ids()
453 rid->roles = FC_RPORT_ROLE_UNKNOWN; in mptfc_generate_rport_ids()
473 if (pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) in mptfc_register_dev()
477 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_register_dev()
478 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_register_dev()
480 list_move_tail(&ri->list, &ioc->fc_rports); in mptfc_register_dev()
489 list_add_tail(&ri->list, &ioc->fc_rports); in mptfc_register_dev()
492 ri->pg0 = *pg0; /* add/update pg0 data */ in mptfc_register_dev()
493 ri->flags &= ~MPT_RPORT_INFO_FLAGS_MISSING; in mptfc_register_dev()
495 /* MPT_RPORT_INFO_FLAGS_REGISTERED - rport not previously deleted */ in mptfc_register_dev()
496 if (!(ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED)) { in mptfc_register_dev()
497 ri->flags |= MPT_RPORT_INFO_FLAGS_REGISTERED; in mptfc_register_dev()
498 rport = fc_remote_port_add(ioc->sh, channel, &rport_ids); in mptfc_register_dev()
500 ri->rport = rport; in mptfc_register_dev()
502 rport->dev_loss_tmo = mptfc_dev_loss_tmo; in mptfc_register_dev()
508 if (ri->starget) { in mptfc_register_dev()
509 vtarget = ri->starget->hostdata; in mptfc_register_dev()
511 vtarget->id = pg0->CurrentTargetID; in mptfc_register_dev()
512 vtarget->channel = pg0->CurrentBus; in mptfc_register_dev()
513 vtarget->deleted = 0; in mptfc_register_dev()
516 *((struct mptfc_rport_info **)rport->dd_data) = ri; in mptfc_register_dev()
520 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_register_dev()
521 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; in mptfc_register_dev()
525 ioc->name, in mptfc_register_dev()
526 ioc->sh->host_no, in mptfc_register_dev()
527 pg0->PortIdentifier, in mptfc_register_dev()
530 pg0->CurrentTargetID, in mptfc_register_dev()
531 ri->rport->scsi_target_id, in mptfc_register_dev()
532 ri->rport->dev_loss_tmo)); in mptfc_register_dev()
534 list_del(&ri->list); in mptfc_register_dev()
553 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_target_destroy()
555 ri->starget = NULL; in mptfc_target_destroy()
557 kfree(starget->hostdata); in mptfc_target_destroy()
558 starget->hostdata = NULL; in mptfc_target_destroy()
564 * Return non-zero if allocation fails.
576 return -ENOMEM; in mptfc_target_alloc()
577 starget->hostdata = vtarget; in mptfc_target_alloc()
579 rc = -ENODEV; in mptfc_target_alloc()
582 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_target_alloc()
584 vtarget->id = ri->pg0.CurrentTargetID; in mptfc_target_alloc()
585 vtarget->channel = ri->pg0.CurrentBus; in mptfc_target_alloc()
586 ri->starget = starget; in mptfc_target_alloc()
592 starget->hostdata = NULL; in mptfc_target_alloc()
611 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_dump_lun_info()
612 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; in mptfc_dump_lun_info()
613 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; in mptfc_dump_lun_info()
617 ioc->name, in mptfc_dump_lun_info()
618 sdev->host->host_no, in mptfc_dump_lun_info()
619 vtarget->num_luns, in mptfc_dump_lun_info()
620 sdev->id, ri->pg0.CurrentTargetID, in mptfc_dump_lun_info()
621 ri->pg0.PortIdentifier, in mptfc_dump_lun_info()
630 * Return non-zero if allocation fails.
647 return -ENXIO; in mptfc_sdev_init()
649 hd = shost_priv(sdev->host); in mptfc_sdev_init()
650 ioc = hd->ioc; in mptfc_sdev_init()
655 ioc->name, sizeof(VirtDevice)); in mptfc_sdev_init()
656 return -ENOMEM; in mptfc_sdev_init()
660 sdev->hostdata = vdevice; in mptfc_sdev_init()
661 vtarget = starget->hostdata; in mptfc_sdev_init()
663 if (vtarget->num_luns == 0) { in mptfc_sdev_init()
664 vtarget->ioc_id = ioc->id; in mptfc_sdev_init()
665 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES; in mptfc_sdev_init()
668 vdevice->vtarget = vtarget; in mptfc_sdev_init()
669 vdevice->lun = sdev->lun; in mptfc_sdev_init()
671 vtarget->num_luns++; in mptfc_sdev_init()
683 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); in mptfc_qcmd()
685 VirtDevice *vdevice = SCpnt->device->hostdata; in mptfc_qcmd()
687 if (!vdevice || !vdevice->vtarget) { in mptfc_qcmd()
688 SCpnt->result = DID_NO_CONNECT << 16; in mptfc_qcmd()
695 SCpnt->result = err; in mptfc_qcmd()
701 ri = *((struct mptfc_rport_info **)rport->dd_data); in mptfc_qcmd()
703 SCpnt->result = DID_IMM_RETRY << 16; in mptfc_qcmd()
712 * mptfc_display_port_link_speed - displaying link speed
727 old_speed = ioc->fc_link_speed[portnum]; in mptfc_display_port_link_speed()
728 new_speed = pp0dest->CurrentSpeed; in mptfc_display_port_link_speed()
729 state = pp0dest->PortState; in mptfc_display_port_link_speed()
744 "FC Link Established, Speed = %s\n", in mptfc_display_port_link_speed()
745 ioc->name, new); in mptfc_display_port_link_speed()
748 "FC Link Speed Change, Old Speed = %s, New Speed = %s\n", in mptfc_display_port_link_speed()
749 ioc->name, old, new); in mptfc_display_port_link_speed()
751 ioc->fc_link_speed[portnum] = new_speed; in mptfc_display_port_link_speed()
756 * mptfc_GetFcPortPage0 - Fetch FCPort config Page0.
761 * -ENOMEM if no memory available
762 * -EPERM if not allowed due to ISR context
763 * -EAGAIN if no msg frames currently available
764 * -EFAULT for non-successful reply or no reply (timeout)
765 * -EINVAL portnum arg out of range (hardwired to two elements)
781 return -EINVAL; in mptfc_GetFcPortPage0()
789 cfg.physAddr = -1; in mptfc_GetFcPortPage0()
802 rc = -ENOMEM; in mptfc_GetFcPortPage0()
803 ppage0_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage0()
814 pp0dest = &ioc->fc_port_page0[portnum]; in mptfc_GetFcPortPage0()
820 * by byte-swapping all > 1 byte fields! in mptfc_GetFcPortPage0()
822 pp0dest->Flags = le32_to_cpu(pp0dest->Flags); in mptfc_GetFcPortPage0()
823 pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); in mptfc_GetFcPortPage0()
824 pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); in mptfc_GetFcPortPage0()
825 pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); in mptfc_GetFcPortPage0()
826 pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); in mptfc_GetFcPortPage0()
827 pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); in mptfc_GetFcPortPage0()
828 pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); in mptfc_GetFcPortPage0()
829 pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); in mptfc_GetFcPortPage0()
830 pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); in mptfc_GetFcPortPage0()
831 pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); in mptfc_GetFcPortPage0()
832 pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); in mptfc_GetFcPortPage0()
833 pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); in mptfc_GetFcPortPage0()
834 pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); in mptfc_GetFcPortPage0()
835 pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); in mptfc_GetFcPortPage0()
836 pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); in mptfc_GetFcPortPage0()
837 pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); in mptfc_GetFcPortPage0()
843 if ((pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) || in mptfc_GetFcPortPage0()
844 (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE && in mptfc_GetFcPortPage0()
845 (pp0dest->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK) in mptfc_GetFcPortPage0()
847 if (count-- > 0) { in mptfc_GetFcPortPage0()
853 ioc->name); in mptfc_GetFcPortPage0()
858 dma_free_coherent(&ioc->pcidev->dev, data_sz, ppage0_alloc, in mptfc_GetFcPortPage0()
873 return -EINVAL; in mptfc_WriteFcPortPage1()
875 if (!(ioc->fc_data.fc_port_page1[portnum].data)) in mptfc_WriteFcPortPage1()
876 return -EINVAL; in mptfc_WriteFcPortPage1()
884 cfg.physAddr = -1; in mptfc_WriteFcPortPage1()
894 return -ENODEV; in mptfc_WriteFcPortPage1()
896 if (hdr.PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz) in mptfc_WriteFcPortPage1()
897 return -EINVAL; in mptfc_WriteFcPortPage1()
899 cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma; in mptfc_WriteFcPortPage1()
919 return -EINVAL; in mptfc_GetFcPortPage1()
927 cfg.physAddr = -1; in mptfc_GetFcPortPage1()
937 return -ENODEV; in mptfc_GetFcPortPage1()
941 if (ioc->fc_data.fc_port_page1[portnum].data == NULL) { in mptfc_GetFcPortPage1()
946 page1_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage1()
949 return -ENOMEM; in mptfc_GetFcPortPage1()
952 page1_alloc = ioc->fc_data.fc_port_page1[portnum].data; in mptfc_GetFcPortPage1()
953 page1_dma = ioc->fc_data.fc_port_page1[portnum].dma; in mptfc_GetFcPortPage1()
954 data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz; in mptfc_GetFcPortPage1()
956 ioc->fc_data.fc_port_page1[portnum].data = NULL; in mptfc_GetFcPortPage1()
957 dma_free_coherent(&ioc->pcidev->dev, data_sz, in mptfc_GetFcPortPage1()
967 ioc->fc_data.fc_port_page1[portnum].data = page1_alloc; in mptfc_GetFcPortPage1()
968 ioc->fc_data.fc_port_page1[portnum].pg_sz = data_sz; in mptfc_GetFcPortPage1()
969 ioc->fc_data.fc_port_page1[portnum].dma = page1_dma; in mptfc_GetFcPortPage1()
972 ioc->fc_data.fc_port_page1[portnum].data = NULL; in mptfc_GetFcPortPage1()
973 dma_free_coherent(&ioc->pcidev->dev, data_sz, page1_alloc, in mptfc_GetFcPortPage1()
991 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { in mptfc_SetFcPortPage1_defaults()
994 pp1 = ioc->fc_data.fc_port_page1[ii].data; in mptfc_SetFcPortPage1_defaults()
995 if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT) in mptfc_SetFcPortPage1_defaults()
996 && (pp1->InitiatorIoPendTimeout == MPTFC_FW_IO_PEND_TIMEOUT) in mptfc_SetFcPortPage1_defaults()
997 && ((pp1->Flags & ON_FLAGS) == ON_FLAGS) in mptfc_SetFcPortPage1_defaults()
998 && ((pp1->Flags & OFF_FLAGS) == 0)) in mptfc_SetFcPortPage1_defaults()
1000 pp1->InitiatorDeviceTimeout = MPTFC_FW_DEVICE_TIMEOUT; in mptfc_SetFcPortPage1_defaults()
1001 pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT; in mptfc_SetFcPortPage1_defaults()
1002 pp1->Flags &= ~OFF_FLAGS; in mptfc_SetFcPortPage1_defaults()
1003 pp1->Flags |= ON_FLAGS; in mptfc_SetFcPortPage1_defaults()
1014 unsigned speed; in mptfc_init_host_attr() local
1025 pp0 = &ioc->fc_port_page0[portnum]; in mptfc_init_host_attr()
1026 sh = ioc->sh; in mptfc_init_host_attr()
1030 ioc->prod_name, in mptfc_init_host_attr()
1032 ioc->facts.FWVersion.Word); in mptfc_init_host_attr()
1036 fc_host_maxframe_size(sh) = pp0->MaxFrameSize; in mptfc_init_host_attr()
1039 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; in mptfc_init_host_attr()
1042 (u64)pp0->WWPN.High << 32 | (u64)pp0->WWPN.Low; in mptfc_init_host_attr()
1044 fc_host_port_id(sh) = pp0->PortIdentifier; in mptfc_init_host_attr()
1046 class = pp0->SupportedServiceClass; in mptfc_init_host_attr()
1055 if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT) in mptfc_init_host_attr()
1056 speed = FC_PORTSPEED_1GBIT; in mptfc_init_host_attr()
1057 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT) in mptfc_init_host_attr()
1058 speed = FC_PORTSPEED_2GBIT; in mptfc_init_host_attr()
1059 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT) in mptfc_init_host_attr()
1060 speed = FC_PORTSPEED_4GBIT; in mptfc_init_host_attr()
1061 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT) in mptfc_init_host_attr()
1062 speed = FC_PORTSPEED_10GBIT; in mptfc_init_host_attr()
1064 speed = FC_PORTSPEED_UNKNOWN; in mptfc_init_host_attr()
1065 fc_host_speed(sh) = speed; in mptfc_init_host_attr()
1067 speed = 0; in mptfc_init_host_attr()
1068 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED) in mptfc_init_host_attr()
1069 speed |= FC_PORTSPEED_1GBIT; in mptfc_init_host_attr()
1070 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED) in mptfc_init_host_attr()
1071 speed |= FC_PORTSPEED_2GBIT; in mptfc_init_host_attr()
1072 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED) in mptfc_init_host_attr()
1073 speed |= FC_PORTSPEED_4GBIT; in mptfc_init_host_attr()
1074 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED) in mptfc_init_host_attr()
1075 speed |= FC_PORTSPEED_10GBIT; in mptfc_init_host_attr()
1076 fc_host_supported_speeds(sh) = speed; in mptfc_init_host_attr()
1079 if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE) in mptfc_init_host_attr()
1081 else if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_OFFLINE) in mptfc_init_host_attr()
1086 if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT) in mptfc_init_host_attr()
1088 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP) in mptfc_init_host_attr()
1090 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP) in mptfc_init_host_attr()
1092 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT) in mptfc_init_host_attr()
1097 (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_FABRIC_WWN_VALID) ? in mptfc_init_host_attr()
1098 (u64) pp0->FabricWWNN.High << 32 | (u64) pp0->FabricWWPN.Low : in mptfc_init_host_attr()
1099 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; in mptfc_init_host_attr()
1110 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) in mptfc_link_status_change()
1126 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_setup_reset()
1127 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_setup_reset()
1128 ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED; in mptfc_setup_reset()
1129 fc_remote_port_delete(ri->rport); /* won't sleep */ in mptfc_setup_reset()
1130 ri->rport = NULL; in mptfc_setup_reset()
1131 starget = ri->starget; in mptfc_setup_reset()
1133 vtarget = starget->hostdata; in mptfc_setup_reset()
1135 vtarget->deleted = 1; in mptfc_setup_reset()
1138 pn = (u64)ri->pg0.WWPN.High << 32 | in mptfc_setup_reset()
1139 (u64)ri->pg0.WWPN.Low; in mptfc_setup_reset()
1142 ioc->name, in mptfc_setup_reset()
1143 ioc->sh->host_no, in mptfc_setup_reset()
1161 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_rescan_devices()
1162 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { in mptfc_rescan_devices()
1163 ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING; in mptfc_rescan_devices()
1171 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_rescan_devices()
1178 list_for_each_entry(ri, &ioc->fc_rports, list) { in mptfc_rescan_devices()
1180 if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) { in mptfc_rescan_devices()
1182 ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED| in mptfc_rescan_devices()
1184 fc_remote_port_delete(ri->rport); /* won't sleep */ in mptfc_rescan_devices()
1185 ri->rport = NULL; in mptfc_rescan_devices()
1186 starget = ri->starget; in mptfc_rescan_devices()
1188 vtarget = starget->hostdata; in mptfc_rescan_devices()
1190 vtarget->deleted = 1; in mptfc_rescan_devices()
1193 pn = (u64)ri->pg0.WWPN.High << 32 | in mptfc_rescan_devices()
1194 (u64)ri->pg0.WWPN.Low; in mptfc_rescan_devices()
1197 ioc->name, in mptfc_rescan_devices()
1198 ioc->sh->host_no, in mptfc_rescan_devices()
1222 ioc->DoneCtx = mptfcDoneCtx; in mptfc_probe()
1223 ioc->TaskCtx = mptfcTaskCtx; in mptfc_probe()
1224 ioc->InternalCtx = mptfcInternalCtx; in mptfc_probe()
1228 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) { in mptfc_probe()
1231 ioc->name); in mptfc_probe()
1232 error = -ENODEV; in mptfc_probe()
1236 if (!ioc->active) { in mptfc_probe()
1238 ioc->name); in mptfc_probe()
1239 error = -ENODEV; in mptfc_probe()
1243 /* Sanity check - ensure at least 1 port is INITIATOR capable in mptfc_probe()
1246 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_probe()
1247 if (ioc->pfacts[ii].ProtocolFlags & in mptfc_probe()
1255 ioc->name, ioc); in mptfc_probe()
1264 ioc->name); in mptfc_probe()
1265 error = -1; in mptfc_probe()
1269 spin_lock_init(&ioc->fc_rescan_work_lock); in mptfc_probe()
1270 INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); in mptfc_probe()
1271 INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); in mptfc_probe()
1272 INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change); in mptfc_probe()
1274 spin_lock_irqsave(&ioc->FreeQlock, flags); in mptfc_probe()
1278 ioc->sh = sh; in mptfc_probe()
1280 sh->io_port = 0; in mptfc_probe()
1281 sh->n_io_port = 0; in mptfc_probe()
1282 sh->irq = 0; in mptfc_probe()
1285 sh->max_cmd_len = 16; in mptfc_probe()
1287 sh->max_id = ioc->pfacts->MaxDevices; in mptfc_probe()
1288 sh->max_lun = max_lun; in mptfc_probe()
1292 sh->unique_id = ioc->id; in mptfc_probe()
1298 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ in mptfc_probe()
1299 * + (req_sz - 64)/sizeof(SGE) in mptfc_probe()
1303 scale = ioc->req_sz/ioc->SGE_size; in mptfc_probe()
1304 if (ioc->sg_addr_size == sizeof(u64)) { in mptfc_probe()
1305 numSGE = (scale - 1) * in mptfc_probe()
1306 (ioc->facts.MaxChainDepth-1) + scale + in mptfc_probe()
1307 (ioc->req_sz - 60) / ioc->SGE_size; in mptfc_probe()
1309 numSGE = 1 + (scale - 1) * in mptfc_probe()
1310 (ioc->facts.MaxChainDepth-1) + scale + in mptfc_probe()
1311 (ioc->req_sz - 64) / ioc->SGE_size; in mptfc_probe()
1314 if (numSGE < sh->sg_tablesize) { in mptfc_probe()
1318 ioc->name, numSGE, sh->sg_tablesize)); in mptfc_probe()
1319 sh->sg_tablesize = numSGE; in mptfc_probe()
1322 spin_unlock_irqrestore(&ioc->FreeQlock, flags); in mptfc_probe()
1325 hd->ioc = ioc; in mptfc_probe()
1330 ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_KERNEL); in mptfc_probe()
1331 if (!ioc->ScsiLookup) { in mptfc_probe()
1332 error = -ENOMEM; in mptfc_probe()
1335 spin_lock_init(&ioc->scsi_lookup_lock); in mptfc_probe()
1338 ioc->name, ioc->ScsiLookup)); in mptfc_probe()
1340 hd->last_queue_full = 0; in mptfc_probe()
1342 sh->transportt = mptfc_transport_template; in mptfc_probe()
1343 error = scsi_add_host (sh, &ioc->pcidev->dev); in mptfc_probe()
1346 "scsi_add_host failed\n", ioc->name)); in mptfc_probe()
1352 ioc->fc_rescan_work_q = alloc_ordered_workqueue( in mptfc_probe()
1353 "mptfc_wq_%d", WQ_MEM_RECLAIM, sh->host_no); in mptfc_probe()
1354 if (!ioc->fc_rescan_work_q) { in mptfc_probe()
1355 error = -ENOMEM; in mptfc_probe()
1360 * Pre-fetch FC port WWN and stuff... in mptfc_probe()
1363 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { in mptfc_probe()
1369 * scan for rports - in mptfc_probe()
1373 queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work); in mptfc_probe()
1374 flush_workqueue(ioc->fc_rescan_work_q); in mptfc_probe()
1402 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; in mptfc_event_process()
1406 if (ioc->bus_type != FC) in mptfc_event_process()
1410 ioc->name, event)); in mptfc_event_process()
1412 if (ioc->sh == NULL || shost_priv(ioc->sh) == NULL) in mptfc_event_process()
1417 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1418 if (ioc->fc_rescan_work_q) { in mptfc_event_process()
1419 queue_work(ioc->fc_rescan_work_q, in mptfc_event_process()
1420 &ioc->fc_rescan_work); in mptfc_event_process()
1422 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1425 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1426 if (ioc->fc_rescan_work_q) { in mptfc_event_process()
1427 queue_work(ioc->fc_rescan_work_q, in mptfc_event_process()
1428 &ioc->fc_lsc_work); in mptfc_event_process()
1430 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_event_process()
1446 if ((ioc->bus_type != FC) || (!rc)) in mptfc_ioc_reset()
1451 ": IOC %s_reset routed to FC host driver!\n",ioc->name, in mptfc_ioc_reset()
1456 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1457 if (ioc->fc_rescan_work_q) { in mptfc_ioc_reset()
1458 queue_work(ioc->fc_rescan_work_q, in mptfc_ioc_reset()
1459 &ioc->fc_setup_reset_work); in mptfc_ioc_reset()
1461 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1469 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1470 if (ioc->fc_rescan_work_q) { in mptfc_ioc_reset()
1471 queue_work(ioc->fc_rescan_work_q, in mptfc_ioc_reset()
1472 &ioc->fc_rescan_work); in mptfc_ioc_reset()
1474 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_ioc_reset()
1479 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1481 * mptfc_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1483 * Returns 0 for success, non-zero for failure.
1500 return -ENODEV; in mptfc_init()
1519 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1521 * mptfc_remove - Remove fc infrastructure for devices
1534 if ((work_q=ioc->fc_rescan_work_q)) { in mptfc_remove()
1535 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); in mptfc_remove()
1536 ioc->fc_rescan_work_q = NULL; in mptfc_remove()
1537 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); in mptfc_remove()
1541 fc_remove_host(ioc->sh); in mptfc_remove()
1543 list_for_each_entry_safe(p, n, &ioc->fc_rports, list) { in mptfc_remove()
1544 list_del(&p->list); in mptfc_remove()
1548 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { in mptfc_remove()
1549 if (ioc->fc_data.fc_port_page1[ii].data) { in mptfc_remove()
1550 dma_free_coherent(&ioc->pcidev->dev, in mptfc_remove()
1551 ioc->fc_data.fc_port_page1[ii].pg_sz, in mptfc_remove()
1552 ioc->fc_data.fc_port_page1[ii].data, in mptfc_remove()
1553 ioc->fc_data.fc_port_page1[ii].dma); in mptfc_remove()
1554 ioc->fc_data.fc_port_page1[ii].data = NULL; in mptfc_remove()
1558 scsi_remove_host(ioc->sh); in mptfc_remove()
1563 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1564 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1566 * mptfc_exit - Unregisters MPT adapter(s)