2 * linux/drivers/message/fusion/mptsas.c
3 * For use with LSI Logic PCI chip/adapter(s)
4 * running LSI Logic Fusion MPT (Message Passing Technology) firmware.
6 * Copyright (c) 1999-2007 LSI Logic Corporation
7 * (mailto:mpt_linux_developer@lsi.com)
8 * Copyright (c) 2005-2007 Dell
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; version 2 of the License.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
22 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26 solely responsible for determining the appropriateness of using and
27 distributing the Program and assumes all risks associated with its
28 exercise of rights under this Agreement, including but not limited to
29 the risks and costs of program errors, damage to or loss of data,
30 programs or equipment, and unavailability or interruption of operations.
32 DISCLAIMER OF LIABILITY
33 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
34 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
36 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
37 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
38 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
39 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
41 You should have received a copy of the GNU General Public License
42 along with this program; if not, write to the Free Software
43 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
47 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/init.h>
50 #include <linux/errno.h>
51 #include <linux/jiffies.h>
52 #include <linux/workqueue.h>
53 #include <linux/delay.h> /* for mdelay */
55 #include <scsi/scsi.h>
56 #include <scsi/scsi_cmnd.h>
57 #include <scsi/scsi_device.h>
58 #include <scsi/scsi_host.h>
59 #include <scsi/scsi_transport_sas.h>
60 #include <scsi/scsi_dbg.h>
66 #define my_NAME "Fusion MPT SAS Host driver"
67 #define my_VERSION MPT_LINUX_VERSION_COMMON
68 #define MYNAM "mptsas"
71 * Reserved channel for integrated raid
73 #define MPTSAS_RAID_CHANNEL 1
75 MODULE_AUTHOR(MODULEAUTHOR);
76 MODULE_DESCRIPTION(my_NAME);
77 MODULE_LICENSE("GPL");
78 MODULE_VERSION(my_VERSION);
80 static int mpt_pt_clear;
81 module_param(mpt_pt_clear, int, 0);
82 MODULE_PARM_DESC(mpt_pt_clear,
83 " Clear persistency table: enable=1 "
84 "(default=MPTSCSIH_PT_CLEAR=0)");
86 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
87 #define MPTSAS_MAX_LUN (16895)
88 static int max_lun = MPTSAS_MAX_LUN;
89 module_param(max_lun, int, 0);
90 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
92 static int mptsasDoneCtx = -1;
93 static int mptsasTaskCtx = -1;
94 static int mptsasInternalCtx = -1; /* Used only for internal commands */
95 static int mptsasMgmtCtx = -1;
97 static void mptsas_hotplug_work(struct work_struct *work);
99 struct mptsas_target_reset_event {
100 struct list_head list;
101 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data;
102 u8 target_reset_issued;
105 enum mptsas_hotplug_action {
110 MPTSAS_ADD_INACTIVE_VOLUME,
114 struct mptsas_hotplug_event {
115 struct work_struct work;
117 enum mptsas_hotplug_action event_type;
125 u8 phys_disk_num_valid; /* hrc (hidden raid component) */
126 u8 phys_disk_num; /* hrc - unique index*/
127 u8 hidden_raid_component; /* hrc - don't expose*/
130 struct mptsas_discovery_event {
131 struct work_struct work;
136 * SAS topology structures
138 * The MPT Fusion firmware interface spreads information about the
139 * SAS topology over many manufacture pages, thus we need some data
140 * structure to collect it and process it for the SAS transport class.
143 struct mptsas_devinfo {
144 u16 handle; /* unique id to address this device */
145 u16 handle_parent; /* unique id to address parent device */
146 u16 handle_enclosure; /* enclosure identifier of the enclosure */
147 u16 slot; /* physical slot in enclosure */
148 u8 phy_id; /* phy number of parent device */
149 u8 port_id; /* sas physical port this device
151 u8 id; /* logical target id of this device */
152 u32 phys_disk_num; /* phys disk id, for csmi-ioctls */
153 u8 channel; /* logical bus number of this device */
154 u64 sas_address; /* WWN of this device,
155 SATA is assigned by HBA,expander */
156 u32 device_info; /* bitfield detailed info about this device */
160 * Specific details on ports, wide/narrow
162 struct mptsas_portinfo_details{
163 u16 num_phys; /* number of phys belong to this port */
164 u64 phy_bitmask; /* TODO, extend support for 255 phys */
165 struct sas_rphy *rphy; /* transport layer rphy object */
166 struct sas_port *port; /* transport layer port object */
167 struct scsi_target *starget;
168 struct mptsas_portinfo *port_info;
171 struct mptsas_phyinfo {
172 u16 handle; /* unique id to address this */
173 u8 phy_id; /* phy index */
174 u8 port_id; /* firmware port identifier */
175 u8 negotiated_link_rate; /* nego'd link rate for this phy */
176 u8 hw_link_rate; /* hardware max/min phys link rate */
177 u8 programmed_link_rate; /* programmed max/min phy link rate */
178 u8 sas_port_add_phy; /* flag to request sas_port_add_phy*/
179 struct mptsas_devinfo identify; /* point to phy device info */
180 struct mptsas_devinfo attached; /* point to attached device info */
181 struct sas_phy *phy; /* transport layer phy object */
182 struct mptsas_portinfo *portinfo;
183 struct mptsas_portinfo_details * port_details;
186 struct mptsas_portinfo {
187 struct list_head list;
188 u16 num_phys; /* number of phys */
189 struct mptsas_phyinfo *phy_info;
192 struct mptsas_enclosure {
193 u64 enclosure_logical_id; /* The WWN for the enclosure */
194 u16 enclosure_handle; /* unique id to address this */
195 u16 flags; /* details enclosure management */
196 u16 num_slot; /* num slots */
197 u16 start_slot; /* first slot */
198 u8 start_id; /* starting logical target id */
199 u8 start_channel; /* starting logical channel id */
200 u8 sep_id; /* SEP device logical target id */
201 u8 sep_channel; /* SEP channel logical channel id */
205 static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
207 printk("---- IO UNIT PAGE 0 ------------\n");
208 printk("Handle=0x%X\n",
209 le16_to_cpu(phy_data->AttachedDeviceHandle));
210 printk("Controller Handle=0x%X\n",
211 le16_to_cpu(phy_data->ControllerDevHandle));
212 printk("Port=0x%X\n", phy_data->Port);
213 printk("Port Flags=0x%X\n", phy_data->PortFlags);
214 printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
215 printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
216 printk("Controller PHY Device Info=0x%X\n",
217 le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
218 printk("DiscoveryStatus=0x%X\n",
219 le32_to_cpu(phy_data->DiscoveryStatus));
223 static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
227 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
229 printk("---- SAS PHY PAGE 0 ------------\n");
230 printk("Attached Device Handle=0x%X\n",
231 le16_to_cpu(pg0->AttachedDevHandle));
232 printk("SAS Address=0x%llX\n",
233 (unsigned long long)le64_to_cpu(sas_address));
234 printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
235 printk("Attached Device Info=0x%X\n",
236 le32_to_cpu(pg0->AttachedDeviceInfo));
237 printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
238 printk("Change Count=0x%X\n", pg0->ChangeCount);
239 printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
243 static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
245 printk("---- SAS PHY PAGE 1 ------------\n");
246 printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
247 printk("Running Disparity Error Count=0x%x\n",
248 pg1->RunningDisparityErrorCount);
249 printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
250 printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
254 static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
258 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
260 printk("---- SAS DEVICE PAGE 0 ---------\n");
261 printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
262 printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle));
263 printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
264 printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
265 printk("SAS Address=0x%llX\n", (unsigned long long)
266 le64_to_cpu(sas_address));
267 printk("Target ID=0x%X\n", pg0->TargetID);
268 printk("Bus=0x%X\n", pg0->Bus);
269 /* The PhyNum field specifies the PHY number of the parent
270 * device this device is linked to
272 printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
273 printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
274 printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
275 printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
276 printk("Physical Port=0x%X\n", pg0->PhysicalPort);
280 static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
282 printk("---- SAS EXPANDER PAGE 1 ------------\n");
284 printk("Physical Port=0x%X\n", pg1->PhysicalPort);
285 printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
286 printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
287 printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
288 printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
289 printk("Owner Device Handle=0x%X\n",
290 le16_to_cpu(pg1->OwnerDevHandle));
291 printk("Attached Device Handle=0x%X\n",
292 le16_to_cpu(pg1->AttachedDevHandle));
295 #define mptsas_print_phy_data(phy_data) do { } while (0)
296 #define mptsas_print_phy_pg0(pg0) do { } while (0)
297 #define mptsas_print_phy_pg1(pg1) do { } while (0)
298 #define mptsas_print_device_pg0(pg0) do { } while (0)
299 #define mptsas_print_expander_pg1(pg1) do { } while (0)
302 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
304 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
305 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
308 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
310 struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
311 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
315 * mptsas_find_portinfo_by_handle
317 * This function should be called with the sas_topology_mutex already held
319 static struct mptsas_portinfo *
320 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
322 struct mptsas_portinfo *port_info, *rc=NULL;
325 list_for_each_entry(port_info, &ioc->sas_topology, list)
326 for (i = 0; i < port_info->num_phys; i++)
327 if (port_info->phy_info[i].identify.handle == handle) {
336 * Returns true if there is a scsi end device
339 mptsas_is_end_device(struct mptsas_devinfo * attached)
341 if ((attached->sas_address) &&
342 (attached->device_info &
343 MPI_SAS_DEVICE_INFO_END_DEVICE) &&
344 ((attached->device_info &
345 MPI_SAS_DEVICE_INFO_SSP_TARGET) |
346 (attached->device_info &
347 MPI_SAS_DEVICE_INFO_STP_TARGET) |
348 (attached->device_info &
349 MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
357 mptsas_port_delete(struct mptsas_portinfo_details * port_details)
359 struct mptsas_portinfo *port_info;
360 struct mptsas_phyinfo *phy_info;
366 port_info = port_details->port_info;
367 phy_info = port_info->phy_info;
369 dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d "
370 "bitmask=0x%016llX\n", __FUNCTION__, port_details,
371 port_details->num_phys, (unsigned long long)
372 port_details->phy_bitmask));
374 for (i = 0; i < port_info->num_phys; i++, phy_info++) {
375 if(phy_info->port_details != port_details)
377 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
378 phy_info->port_details = NULL;
383 static inline struct sas_rphy *
384 mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
386 if (phy_info->port_details)
387 return phy_info->port_details->rphy;
393 mptsas_set_rphy(struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
395 if (phy_info->port_details) {
396 phy_info->port_details->rphy = rphy;
397 dsaswideprintk((KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
400 #ifdef MPT_DEBUG_SAS_WIDE
402 dev_printk(KERN_DEBUG, &rphy->dev, "add:");
403 printk("rphy=%p release=%p\n",
404 rphy, rphy->dev.release);
409 static inline struct sas_port *
410 mptsas_get_port(struct mptsas_phyinfo *phy_info)
412 if (phy_info->port_details)
413 return phy_info->port_details->port;
419 mptsas_set_port(struct mptsas_phyinfo *phy_info, struct sas_port *port)
421 if (phy_info->port_details)
422 phy_info->port_details->port = port;
424 #ifdef MPT_DEBUG_SAS_WIDE
426 dev_printk(KERN_DEBUG, &port->dev, "add: ");
427 printk("port=%p release=%p\n",
428 port, port->dev.release);
433 static inline struct scsi_target *
434 mptsas_get_starget(struct mptsas_phyinfo *phy_info)
436 if (phy_info->port_details)
437 return phy_info->port_details->starget;
443 mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target *
446 if (phy_info->port_details)
447 phy_info->port_details->starget = starget;
452 * mptsas_setup_wide_ports
454 * Updates for new and existing narrow/wide port configuration
455 * in the sas_topology
458 mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
460 struct mptsas_portinfo_details * port_details;
461 struct mptsas_phyinfo *phy_info, *phy_info_cmp;
465 mutex_lock(&ioc->sas_topology_mutex);
467 phy_info = port_info->phy_info;
468 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
469 if (phy_info->attached.handle)
471 port_details = phy_info->port_details;
474 if (port_details->num_phys < 2)
477 * Removing a phy from a port, letting the last
478 * phy be removed by firmware events.
480 dsaswideprintk((KERN_DEBUG
481 "%s: [%p]: deleting phy = %d\n",
482 __FUNCTION__, port_details, i));
483 port_details->num_phys--;
484 port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
485 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
486 sas_port_delete_phy(port_details->port, phy_info->phy);
487 phy_info->port_details = NULL;
491 * Populate and refresh the tree
493 phy_info = port_info->phy_info;
494 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
495 sas_address = phy_info->attached.sas_address;
496 dsaswideprintk((KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
497 i, (unsigned long long)sas_address));
500 port_details = phy_info->port_details;
505 port_details = kzalloc(sizeof(*port_details),
509 port_details->num_phys = 1;
510 port_details->port_info = port_info;
511 if (phy_info->phy_id < 64 )
512 port_details->phy_bitmask |=
513 (1 << phy_info->phy_id);
514 phy_info->sas_port_add_phy=1;
515 dsaswideprintk((KERN_DEBUG "\t\tForming port\n\t\t"
516 "phy_id=%d sas_address=0x%018llX\n",
517 i, (unsigned long long)sas_address));
518 phy_info->port_details = port_details;
521 if (i == port_info->num_phys - 1)
523 phy_info_cmp = &port_info->phy_info[i + 1];
524 for (j = i + 1 ; j < port_info->num_phys ; j++,
526 if (!phy_info_cmp->attached.sas_address)
528 if (sas_address != phy_info_cmp->attached.sas_address)
530 if (phy_info_cmp->port_details == port_details )
532 dsaswideprintk((KERN_DEBUG
533 "\t\tphy_id=%d sas_address=0x%018llX\n",
534 j, (unsigned long long)
535 phy_info_cmp->attached.sas_address));
536 if (phy_info_cmp->port_details) {
538 mptsas_get_rphy(phy_info_cmp);
540 mptsas_get_port(phy_info_cmp);
541 port_details->starget =
542 mptsas_get_starget(phy_info_cmp);
543 port_details->num_phys =
544 phy_info_cmp->port_details->num_phys;
545 if (!phy_info_cmp->port_details->num_phys)
546 kfree(phy_info_cmp->port_details);
548 phy_info_cmp->sas_port_add_phy=1;
550 * Adding a phy to a port
552 phy_info_cmp->port_details = port_details;
553 if (phy_info_cmp->phy_id < 64 )
554 port_details->phy_bitmask |=
555 (1 << phy_info_cmp->phy_id);
556 port_details->num_phys++;
562 #ifdef MPT_DEBUG_SAS_WIDE
563 for (i = 0; i < port_info->num_phys; i++) {
564 port_details = port_info->phy_info[i].port_details;
567 dsaswideprintk((KERN_DEBUG
568 "%s: [%p]: phy_id=%02d num_phys=%02d "
569 "bitmask=0x%016llX\n", __FUNCTION__,
570 port_details, i, port_details->num_phys,
571 (unsigned long long)port_details->phy_bitmask));
572 dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n",
573 port_details->port, port_details->rphy));
575 dsaswideprintk((KERN_DEBUG"\n"));
577 mutex_unlock(&ioc->sas_topology_mutex);
581 * csmisas_find_vtarget
589 mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
591 struct scsi_device *sdev;
593 VirtTarget *vtarget = NULL;
595 shost_for_each_device(sdev, ioc->sh) {
596 if ((vdev = sdev->hostdata) == NULL)
598 if (vdev->vtarget->id == id &&
599 vdev->vtarget->channel == channel)
600 vtarget = vdev->vtarget;
606 * mptsas_target_reset
608 * Issues TARGET_RESET to end device using handshaking method
614 * Returns (1) success
619 mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
622 SCSITaskMgmt_t *pScsiTm;
624 if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
625 dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
626 ioc->name,__FUNCTION__, __LINE__));
630 /* Format the Request
632 pScsiTm = (SCSITaskMgmt_t *) mf;
633 memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
634 pScsiTm->TargetID = id;
635 pScsiTm->Bus = channel;
636 pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
637 pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
638 pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
640 DBG_DUMP_TM_REQUEST_FRAME(mf);
642 if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
643 sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
644 mpt_free_msg_frame(ioc, mf);
645 dfailprintk((MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
646 ioc->name,__FUNCTION__, __LINE__));
654 * mptsas_target_reset_queue
656 * Receive request for TARGET_RESET after recieving an firmware
657 * event NOT_RESPONDING_EVENT, then put command in link list
658 * and queue if task_queue already in use.
665 mptsas_target_reset_queue(MPT_ADAPTER *ioc,
666 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
668 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
669 VirtTarget *vtarget = NULL;
670 struct mptsas_target_reset_event *target_reset_list;
673 id = sas_event_data->TargetID;
674 channel = sas_event_data->Bus;
676 if (!(vtarget = mptsas_find_vtarget(ioc, channel, id)))
679 vtarget->deleted = 1; /* block IO */
681 target_reset_list = kzalloc(sizeof(*target_reset_list),
683 if (!target_reset_list) {
684 dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
685 ioc->name,__FUNCTION__, __LINE__));
689 memcpy(&target_reset_list->sas_event_data, sas_event_data,
690 sizeof(*sas_event_data));
691 list_add_tail(&target_reset_list->list, &hd->target_reset_list);
693 if (hd->resetPending)
696 if (mptsas_target_reset(ioc, channel, id)) {
697 target_reset_list->target_reset_issued = 1;
698 hd->resetPending = 1;
703 * mptsas_dev_reset_complete
705 * Completion for TARGET_RESET after NOT_RESPONDING_EVENT,
706 * enable work queue to finish off removing device from upper layers.
707 * then send next TARGET_RESET in the queue.
713 mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
715 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
716 struct list_head *head = &hd->target_reset_list;
717 struct mptsas_target_reset_event *target_reset_list;
718 struct mptsas_hotplug_event *ev;
719 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
723 if (list_empty(head))
726 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, list);
728 sas_event_data = &target_reset_list->sas_event_data;
729 id = sas_event_data->TargetID;
730 channel = sas_event_data->Bus;
731 hd->resetPending = 0;
736 if (!target_reset_list->target_reset_issued) {
737 if (mptsas_target_reset(ioc, channel, id)) {
738 target_reset_list->target_reset_issued = 1;
739 hd->resetPending = 1;
745 * enable work queue to remove device from upper layers
747 list_del(&target_reset_list->list);
749 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
751 dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
752 ioc->name,__FUNCTION__, __LINE__));
756 INIT_WORK(&ev->work, mptsas_hotplug_work);
758 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
760 le16_to_cpu(sas_event_data->ParentDevHandle);
761 ev->channel = channel;
763 ev->phy_id = sas_event_data->PhyNum;
764 memcpy(&sas_address, &sas_event_data->SASAddress,
766 ev->sas_address = le64_to_cpu(sas_address);
767 ev->device_info = le32_to_cpu(sas_event_data->DeviceInfo);
768 ev->event_type = MPTSAS_DEL_DEVICE;
769 schedule_work(&ev->work);
770 kfree(target_reset_list);
773 * issue target reset to next device in the queue
776 head = &hd->target_reset_list;
777 if (list_empty(head))
780 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event,
783 sas_event_data = &target_reset_list->sas_event_data;
784 id = sas_event_data->TargetID;
785 channel = sas_event_data->Bus;
787 if (mptsas_target_reset(ioc, channel, id)) {
788 target_reset_list->target_reset_issued = 1;
789 hd->resetPending = 1;
794 * mptsas_taskmgmt_complete
802 mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
804 mptsas_dev_reset_complete(ioc);
805 return mptscsih_taskmgmt_complete(ioc, mf, mr);
816 mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
819 struct mptsas_target_reset_event *target_reset_list, *n;
822 rc = mptscsih_ioc_reset(ioc, reset_phase);
824 if (ioc->bus_type != SAS)
827 if (reset_phase != MPT_IOC_POST_RESET)
830 if (!ioc->sh || !ioc->sh->hostdata)
832 hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
836 if (list_empty(&hd->target_reset_list))
839 /* flush the target_reset_list */
840 list_for_each_entry_safe(target_reset_list, n,
841 &hd->target_reset_list, list) {
842 list_del(&target_reset_list->list);
843 kfree(target_reset_list);
851 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
852 u32 form, u32 form_specific)
854 ConfigExtendedPageHeader_t hdr;
856 SasEnclosurePage0_t *buffer;
857 dma_addr_t dma_handle;
859 __le64 le_identifier;
861 memset(&hdr, 0, sizeof(hdr));
862 hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
864 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
865 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
867 cfg.cfghdr.ehdr = &hdr;
869 cfg.pageAddr = form + form_specific;
870 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
871 cfg.dir = 0; /* read */
874 error = mpt_config(ioc, &cfg);
877 if (!hdr.ExtPageLength) {
882 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
889 cfg.physAddr = dma_handle;
890 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
892 error = mpt_config(ioc, &cfg);
894 goto out_free_consistent;
896 /* save config data */
897 memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
898 enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
899 enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
900 enclosure->flags = le16_to_cpu(buffer->Flags);
901 enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
902 enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
903 enclosure->start_id = buffer->StartTargetID;
904 enclosure->start_channel = buffer->StartBus;
905 enclosure->sep_id = buffer->SEPTargetID;
906 enclosure->sep_channel = buffer->SEPBus;
909 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
916 mptsas_slave_configure(struct scsi_device *sdev)
919 if (sdev->channel == MPTSAS_RAID_CHANNEL)
922 sas_read_port_mode_page(sdev);
925 return mptscsih_slave_configure(sdev);
929 mptsas_target_alloc(struct scsi_target *starget)
931 struct Scsi_Host *host = dev_to_shost(&starget->dev);
932 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
935 struct sas_rphy *rphy;
936 struct mptsas_portinfo *p;
939 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
943 vtarget->starget = starget;
944 vtarget->ioc_id = hd->ioc->id;
945 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
950 * RAID volumes placed beyond the last expected port.
952 if (starget->channel == MPTSAS_RAID_CHANNEL) {
953 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
954 if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
955 channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
959 rphy = dev_to_rphy(starget->dev.parent);
960 mutex_lock(&hd->ioc->sas_topology_mutex);
961 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
962 for (i = 0; i < p->num_phys; i++) {
963 if (p->phy_info[i].attached.sas_address !=
964 rphy->identify.sas_address)
966 id = p->phy_info[i].attached.id;
967 channel = p->phy_info[i].attached.channel;
968 mptsas_set_starget(&p->phy_info[i], starget);
971 * Exposing hidden raid components
973 if (mptscsih_is_phys_disk(hd->ioc, channel, id)) {
974 id = mptscsih_raid_id_to_num(hd->ioc,
977 MPT_TARGET_FLAGS_RAID_COMPONENT;
978 p->phy_info[i].attached.phys_disk_num = id;
980 mutex_unlock(&hd->ioc->sas_topology_mutex);
984 mutex_unlock(&hd->ioc->sas_topology_mutex);
991 vtarget->channel = channel;
992 starget->hostdata = vtarget;
997 mptsas_target_destroy(struct scsi_target *starget)
999 struct Scsi_Host *host = dev_to_shost(&starget->dev);
1000 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
1001 struct sas_rphy *rphy;
1002 struct mptsas_portinfo *p;
1005 if (!starget->hostdata)
1008 if (starget->channel == MPTSAS_RAID_CHANNEL)
1011 rphy = dev_to_rphy(starget->dev.parent);
1012 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1013 for (i = 0; i < p->num_phys; i++) {
1014 if (p->phy_info[i].attached.sas_address !=
1015 rphy->identify.sas_address)
1017 mptsas_set_starget(&p->phy_info[i], NULL);
1023 kfree(starget->hostdata);
1024 starget->hostdata = NULL;
1029 mptsas_slave_alloc(struct scsi_device *sdev)
1031 struct Scsi_Host *host = sdev->host;
1032 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
1033 struct sas_rphy *rphy;
1034 struct mptsas_portinfo *p;
1036 struct scsi_target *starget;
1039 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
1041 printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
1042 hd->ioc->name, sizeof(VirtDevice));
1045 starget = scsi_target(sdev);
1046 vdev->vtarget = starget->hostdata;
1048 if (sdev->channel == MPTSAS_RAID_CHANNEL)
1051 rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
1052 mutex_lock(&hd->ioc->sas_topology_mutex);
1053 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1054 for (i = 0; i < p->num_phys; i++) {
1055 if (p->phy_info[i].attached.sas_address !=
1056 rphy->identify.sas_address)
1058 vdev->lun = sdev->lun;
1060 * Exposing hidden raid components
1062 if (mptscsih_is_phys_disk(hd->ioc,
1063 p->phy_info[i].attached.channel,
1064 p->phy_info[i].attached.id))
1065 sdev->no_uld_attach = 1;
1066 mutex_unlock(&hd->ioc->sas_topology_mutex);
1070 mutex_unlock(&hd->ioc->sas_topology_mutex);
1076 vdev->vtarget->num_luns++;
1077 sdev->hostdata = vdev;
1082 mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1084 VirtDevice *vdev = SCpnt->device->hostdata;
1086 if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) {
1087 SCpnt->result = DID_NO_CONNECT << 16;
1092 // scsi_print_command(SCpnt);
1094 return mptscsih_qcmd(SCpnt,done);
1098 static struct scsi_host_template mptsas_driver_template = {
1099 .module = THIS_MODULE,
1100 .proc_name = "mptsas",
1101 .proc_info = mptscsih_proc_info,
1102 .name = "MPT SPI Host",
1103 .info = mptscsih_info,
1104 .queuecommand = mptsas_qcmd,
1105 .target_alloc = mptsas_target_alloc,
1106 .slave_alloc = mptsas_slave_alloc,
1107 .slave_configure = mptsas_slave_configure,
1108 .target_destroy = mptsas_target_destroy,
1109 .slave_destroy = mptscsih_slave_destroy,
1110 .change_queue_depth = mptscsih_change_queue_depth,
1111 .eh_abort_handler = mptscsih_abort,
1112 .eh_device_reset_handler = mptscsih_dev_reset,
1113 .eh_bus_reset_handler = mptscsih_bus_reset,
1114 .eh_host_reset_handler = mptscsih_host_reset,
1115 .bios_param = mptscsih_bios_param,
1116 .can_queue = MPT_FC_CAN_QUEUE,
1118 .sg_tablesize = MPT_SCSI_SG_DEPTH,
1119 .max_sectors = 8192,
1121 .use_clustering = ENABLE_CLUSTERING,
1124 static int mptsas_get_linkerrors(struct sas_phy *phy)
1126 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1127 ConfigExtendedPageHeader_t hdr;
1129 SasPhyPage1_t *buffer;
1130 dma_addr_t dma_handle;
1133 /* FIXME: only have link errors on local phys */
1134 if (!scsi_is_sas_phy_local(phy))
1137 hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
1138 hdr.ExtPageLength = 0;
1139 hdr.PageNumber = 1 /* page number 1*/;
1142 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1143 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1145 cfg.cfghdr.ehdr = &hdr;
1147 cfg.pageAddr = phy->identify.phy_identifier;
1148 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1149 cfg.dir = 0; /* read */
1152 error = mpt_config(ioc, &cfg);
1155 if (!hdr.ExtPageLength)
1158 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1163 cfg.physAddr = dma_handle;
1164 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1166 error = mpt_config(ioc, &cfg);
1168 goto out_free_consistent;
1170 mptsas_print_phy_pg1(buffer);
1172 phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
1173 phy->running_disparity_error_count =
1174 le32_to_cpu(buffer->RunningDisparityErrorCount);
1175 phy->loss_of_dword_sync_count =
1176 le32_to_cpu(buffer->LossDwordSynchCount);
1177 phy->phy_reset_problem_count =
1178 le32_to_cpu(buffer->PhyResetProblemCount);
1180 out_free_consistent:
1181 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1182 buffer, dma_handle);
1186 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
1187 MPT_FRAME_HDR *reply)
1189 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
1190 if (reply != NULL) {
1191 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
1192 memcpy(ioc->sas_mgmt.reply, reply,
1193 min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
1195 complete(&ioc->sas_mgmt.done);
1199 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
1201 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1202 SasIoUnitControlRequest_t *req;
1203 SasIoUnitControlReply_t *reply;
1206 unsigned long timeleft;
1207 int error = -ERESTARTSYS;
1209 /* FIXME: fusion doesn't allow non-local phy reset */
1210 if (!scsi_is_sas_phy_local(phy))
1213 /* not implemented for expanders */
1214 if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
1217 if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
1220 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1226 hdr = (MPIHeader_t *) mf;
1227 req = (SasIoUnitControlRequest_t *)mf;
1228 memset(req, 0, sizeof(SasIoUnitControlRequest_t));
1229 req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
1230 req->MsgContext = hdr->MsgContext;
1231 req->Operation = hard_reset ?
1232 MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
1233 req->PhyNum = phy->identify.phy_identifier;
1235 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1237 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
1240 /* On timeout reset the board */
1241 mpt_free_msg_frame(ioc, mf);
1242 mpt_HardResetHandler(ioc, CAN_SLEEP);
1247 /* a reply frame is expected */
1248 if ((ioc->sas_mgmt.status &
1249 MPT_IOCTL_STATUS_RF_VALID) == 0) {
1254 /* process the completed Reply Message Frame */
1255 reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
1256 if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
1257 printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
1268 mutex_unlock(&ioc->sas_mgmt.mutex);
1274 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
1276 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1278 struct mptsas_portinfo *p;
1279 struct mptsas_enclosure enclosure_info;
1280 u64 enclosure_handle;
1282 mutex_lock(&ioc->sas_topology_mutex);
1283 list_for_each_entry(p, &ioc->sas_topology, list) {
1284 for (i = 0; i < p->num_phys; i++) {
1285 if (p->phy_info[i].attached.sas_address ==
1286 rphy->identify.sas_address) {
1287 enclosure_handle = p->phy_info[i].
1288 attached.handle_enclosure;
1293 mutex_unlock(&ioc->sas_topology_mutex);
1297 mutex_unlock(&ioc->sas_topology_mutex);
1298 memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
1299 error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
1300 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
1301 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
1303 *identifier = enclosure_info.enclosure_logical_id;
1308 mptsas_get_bay_identifier(struct sas_rphy *rphy)
1310 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1311 struct mptsas_portinfo *p;
1314 mutex_lock(&ioc->sas_topology_mutex);
1315 list_for_each_entry(p, &ioc->sas_topology, list) {
1316 for (i = 0; i < p->num_phys; i++) {
1317 if (p->phy_info[i].attached.sas_address ==
1318 rphy->identify.sas_address) {
1319 rc = p->phy_info[i].attached.slot;
1326 mutex_unlock(&ioc->sas_topology_mutex);
1330 static struct sas_function_template mptsas_transport_functions = {
1331 .get_linkerrors = mptsas_get_linkerrors,
1332 .get_enclosure_identifier = mptsas_get_enclosure_identifier,
1333 .get_bay_identifier = mptsas_get_bay_identifier,
1334 .phy_reset = mptsas_phy_reset,
1337 static struct scsi_transport_template *mptsas_transport_template;
1340 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
1342 ConfigExtendedPageHeader_t hdr;
1344 SasIOUnitPage0_t *buffer;
1345 dma_addr_t dma_handle;
1348 hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
1349 hdr.ExtPageLength = 0;
1353 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1354 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1356 cfg.cfghdr.ehdr = &hdr;
1359 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1360 cfg.dir = 0; /* read */
1363 error = mpt_config(ioc, &cfg);
1366 if (!hdr.ExtPageLength) {
1371 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1378 cfg.physAddr = dma_handle;
1379 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1381 error = mpt_config(ioc, &cfg);
1383 goto out_free_consistent;
1385 port_info->num_phys = buffer->NumPhys;
1386 port_info->phy_info = kcalloc(port_info->num_phys,
1387 sizeof(*port_info->phy_info),GFP_KERNEL);
1388 if (!port_info->phy_info) {
1390 goto out_free_consistent;
1393 for (i = 0; i < port_info->num_phys; i++) {
1394 mptsas_print_phy_data(&buffer->PhyData[i]);
1395 port_info->phy_info[i].phy_id = i;
1396 port_info->phy_info[i].port_id =
1397 buffer->PhyData[i].Port;
1398 port_info->phy_info[i].negotiated_link_rate =
1399 buffer->PhyData[i].NegotiatedLinkRate;
1400 port_info->phy_info[i].portinfo = port_info;
1401 port_info->phy_info[i].handle =
1402 le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
1405 out_free_consistent:
1406 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1407 buffer, dma_handle);
1413 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1414 u32 form, u32 form_specific)
1416 ConfigExtendedPageHeader_t hdr;
1418 SasPhyPage0_t *buffer;
1419 dma_addr_t dma_handle;
1422 hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
1423 hdr.ExtPageLength = 0;
1427 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1428 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1430 cfg.cfghdr.ehdr = &hdr;
1431 cfg.dir = 0; /* read */
1434 /* Get Phy Pg 0 for each Phy. */
1436 cfg.pageAddr = form + form_specific;
1437 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1439 error = mpt_config(ioc, &cfg);
1443 if (!hdr.ExtPageLength) {
1448 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1455 cfg.physAddr = dma_handle;
1456 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1458 error = mpt_config(ioc, &cfg);
1460 goto out_free_consistent;
1462 mptsas_print_phy_pg0(buffer);
1464 phy_info->hw_link_rate = buffer->HwLinkRate;
1465 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1466 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1467 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1469 out_free_consistent:
1470 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1471 buffer, dma_handle);
1477 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
1478 u32 form, u32 form_specific)
1480 ConfigExtendedPageHeader_t hdr;
1482 SasDevicePage0_t *buffer;
1483 dma_addr_t dma_handle;
1487 if (ioc->sas_discovery_runtime &&
1488 mptsas_is_end_device(device_info))
1491 hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
1492 hdr.ExtPageLength = 0;
1496 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1497 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
1499 cfg.cfghdr.ehdr = &hdr;
1500 cfg.pageAddr = form + form_specific;
1502 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1503 cfg.dir = 0; /* read */
1506 memset(device_info, 0, sizeof(struct mptsas_devinfo));
1507 error = mpt_config(ioc, &cfg);
1510 if (!hdr.ExtPageLength) {
1515 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1522 cfg.physAddr = dma_handle;
1523 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1525 error = mpt_config(ioc, &cfg);
1527 goto out_free_consistent;
1529 mptsas_print_device_pg0(buffer);
1531 device_info->handle = le16_to_cpu(buffer->DevHandle);
1532 device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
1533 device_info->handle_enclosure =
1534 le16_to_cpu(buffer->EnclosureHandle);
1535 device_info->slot = le16_to_cpu(buffer->Slot);
1536 device_info->phy_id = buffer->PhyNum;
1537 device_info->port_id = buffer->PhysicalPort;
1538 device_info->id = buffer->TargetID;
1539 device_info->phys_disk_num = ~0;
1540 device_info->channel = buffer->Bus;
1541 memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
1542 device_info->sas_address = le64_to_cpu(sas_address);
1543 device_info->device_info =
1544 le32_to_cpu(buffer->DeviceInfo);
1546 out_free_consistent:
1547 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1548 buffer, dma_handle);
1554 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
1555 u32 form, u32 form_specific)
1557 ConfigExtendedPageHeader_t hdr;
1559 SasExpanderPage0_t *buffer;
1560 dma_addr_t dma_handle;
1563 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1564 hdr.ExtPageLength = 0;
1568 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1569 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1571 cfg.cfghdr.ehdr = &hdr;
1573 cfg.pageAddr = form + form_specific;
1574 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1575 cfg.dir = 0; /* read */
1578 memset(port_info, 0, sizeof(struct mptsas_portinfo));
1579 error = mpt_config(ioc, &cfg);
1583 if (!hdr.ExtPageLength) {
1588 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1595 cfg.physAddr = dma_handle;
1596 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1598 error = mpt_config(ioc, &cfg);
1600 goto out_free_consistent;
1602 /* save config data */
1603 port_info->num_phys = buffer->NumPhys;
1604 port_info->phy_info = kcalloc(port_info->num_phys,
1605 sizeof(*port_info->phy_info),GFP_KERNEL);
1606 if (!port_info->phy_info) {
1608 goto out_free_consistent;
1611 for (i = 0; i < port_info->num_phys; i++) {
1612 port_info->phy_info[i].portinfo = port_info;
1613 port_info->phy_info[i].handle =
1614 le16_to_cpu(buffer->DevHandle);
1617 out_free_consistent:
1618 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1619 buffer, dma_handle);
1625 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1626 u32 form, u32 form_specific)
1628 ConfigExtendedPageHeader_t hdr;
1630 SasExpanderPage1_t *buffer;
1631 dma_addr_t dma_handle;
1634 if (ioc->sas_discovery_runtime &&
1635 mptsas_is_end_device(&phy_info->attached))
1638 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1639 hdr.ExtPageLength = 0;
1643 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1644 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1646 cfg.cfghdr.ehdr = &hdr;
1648 cfg.pageAddr = form + form_specific;
1649 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1650 cfg.dir = 0; /* read */
1653 error = mpt_config(ioc, &cfg);
1657 if (!hdr.ExtPageLength) {
1662 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1669 cfg.physAddr = dma_handle;
1670 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1672 error = mpt_config(ioc, &cfg);
1674 goto out_free_consistent;
1677 mptsas_print_expander_pg1(buffer);
1679 /* save config data */
1680 phy_info->phy_id = buffer->PhyIdentifier;
1681 phy_info->port_id = buffer->PhysicalPort;
1682 phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1683 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1684 phy_info->hw_link_rate = buffer->HwLinkRate;
1685 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1686 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1688 out_free_consistent:
1689 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1690 buffer, dma_handle);
1696 mptsas_parse_device_info(struct sas_identify *identify,
1697 struct mptsas_devinfo *device_info)
1701 identify->sas_address = device_info->sas_address;
1702 identify->phy_identifier = device_info->phy_id;
1705 * Fill in Phy Initiator Port Protocol.
1706 * Bits 6:3, more than one bit can be set, fall through cases.
1708 protocols = device_info->device_info & 0x78;
1709 identify->initiator_port_protocols = 0;
1710 if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1711 identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1712 if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1713 identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1714 if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1715 identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1716 if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1717 identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1720 * Fill in Phy Target Port Protocol.
1721 * Bits 10:7, more than one bit can be set, fall through cases.
1723 protocols = device_info->device_info & 0x780;
1724 identify->target_port_protocols = 0;
1725 if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1726 identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1727 if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1728 identify->target_port_protocols |= SAS_PROTOCOL_STP;
1729 if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1730 identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1731 if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1732 identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1735 * Fill in Attached device type.
1737 switch (device_info->device_info &
1738 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1739 case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1740 identify->device_type = SAS_PHY_UNUSED;
1742 case MPI_SAS_DEVICE_INFO_END_DEVICE:
1743 identify->device_type = SAS_END_DEVICE;
1745 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1746 identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1748 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1749 identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1754 static int mptsas_probe_one_phy(struct device *dev,
1755 struct mptsas_phyinfo *phy_info, int index, int local)
1758 struct sas_phy *phy;
1759 struct sas_port *port;
1767 if (!phy_info->phy) {
1768 phy = sas_phy_alloc(dev, index);
1774 phy = phy_info->phy;
1776 mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1779 * Set Negotiated link rate.
1781 switch (phy_info->negotiated_link_rate) {
1782 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1783 phy->negotiated_linkrate = SAS_PHY_DISABLED;
1785 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1786 phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1788 case MPI_SAS_IOUNIT0_RATE_1_5:
1789 phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1791 case MPI_SAS_IOUNIT0_RATE_3_0:
1792 phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1794 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1795 case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1797 phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1802 * Set Max hardware link rate.
1804 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1805 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1806 phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1808 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1809 phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1816 * Set Max programmed link rate.
1818 switch (phy_info->programmed_link_rate &
1819 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1820 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1821 phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1823 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1824 phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1831 * Set Min hardware link rate.
1833 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1834 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1835 phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1837 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1838 phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1845 * Set Min programmed link rate.
1847 switch (phy_info->programmed_link_rate &
1848 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1849 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1850 phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1852 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1853 phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1859 if (!phy_info->phy) {
1861 error = sas_phy_add(phy);
1866 phy_info->phy = phy;
1869 if (!phy_info->attached.handle ||
1870 !phy_info->port_details)
1873 port = mptsas_get_port(phy_info);
1874 ioc = phy_to_ioc(phy_info->phy);
1876 if (phy_info->sas_port_add_phy) {
1879 port = sas_port_alloc_num(dev);
1884 error = sas_port_add(port);
1886 dfailprintk((MYIOC_s_ERR_FMT
1887 "%s: exit at line=%d\n", ioc->name,
1888 __FUNCTION__, __LINE__));
1891 mptsas_set_port(phy_info, port);
1892 dsaswideprintk((KERN_DEBUG
1893 "sas_port_alloc: port=%p dev=%p port_id=%d\n",
1894 port, dev, port->port_identifier));
1896 dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
1898 sas_port_add_phy(port, phy_info->phy);
1899 phy_info->sas_port_add_phy = 0;
1902 if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
1904 struct sas_rphy *rphy;
1905 struct device *parent;
1906 struct sas_identify identify;
1908 parent = dev->parent->parent;
1910 * Let the hotplug_work thread handle processing
1911 * the adding/removing of devices that occur
1912 * after start of day.
1914 if (ioc->sas_discovery_runtime &&
1915 mptsas_is_end_device(&phy_info->attached))
1918 mptsas_parse_device_info(&identify, &phy_info->attached);
1919 if (scsi_is_host_device(parent)) {
1920 struct mptsas_portinfo *port_info;
1923 mutex_lock(&ioc->sas_topology_mutex);
1924 port_info = mptsas_find_portinfo_by_handle(ioc,
1926 mutex_unlock(&ioc->sas_topology_mutex);
1928 for (i = 0; i < port_info->num_phys; i++)
1929 if (port_info->phy_info[i].identify.sas_address ==
1930 identify.sas_address) {
1931 sas_port_mark_backlink(port);
1935 } else if (scsi_is_sas_rphy(parent)) {
1936 struct sas_rphy *parent_rphy = dev_to_rphy(parent);
1937 if (identify.sas_address ==
1938 parent_rphy->identify.sas_address) {
1939 sas_port_mark_backlink(port);
1944 switch (identify.device_type) {
1945 case SAS_END_DEVICE:
1946 rphy = sas_end_device_alloc(port);
1948 case SAS_EDGE_EXPANDER_DEVICE:
1949 case SAS_FANOUT_EXPANDER_DEVICE:
1950 rphy = sas_expander_alloc(port, identify.device_type);
1957 dfailprintk((MYIOC_s_ERR_FMT
1958 "%s: exit at line=%d\n", ioc->name,
1959 __FUNCTION__, __LINE__));
1963 rphy->identify = identify;
1964 error = sas_rphy_add(rphy);
1966 dfailprintk((MYIOC_s_ERR_FMT
1967 "%s: exit at line=%d\n", ioc->name,
1968 __FUNCTION__, __LINE__));
1969 sas_rphy_free(rphy);
1972 mptsas_set_rphy(phy_info, rphy);
1980 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
1982 struct mptsas_portinfo *port_info, *hba;
1983 int error = -ENOMEM, i;
1985 hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
1989 error = mptsas_sas_io_unit_pg0(ioc, hba);
1991 goto out_free_port_info;
1993 mutex_lock(&ioc->sas_topology_mutex);
1994 ioc->handle = hba->phy_info[0].handle;
1995 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
1998 list_add_tail(&port_info->list, &ioc->sas_topology);
2000 for (i = 0; i < hba->num_phys; i++) {
2001 port_info->phy_info[i].negotiated_link_rate =
2002 hba->phy_info[i].negotiated_link_rate;
2003 port_info->phy_info[i].handle =
2004 hba->phy_info[i].handle;
2005 port_info->phy_info[i].port_id =
2006 hba->phy_info[i].port_id;
2008 kfree(hba->phy_info);
2012 mutex_unlock(&ioc->sas_topology_mutex);
2013 for (i = 0; i < port_info->num_phys; i++) {
2014 mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
2015 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
2016 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
2018 mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
2019 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2020 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2021 port_info->phy_info[i].handle);
2022 port_info->phy_info[i].identify.phy_id =
2023 port_info->phy_info[i].phy_id = i;
2024 if (port_info->phy_info[i].attached.handle)
2025 mptsas_sas_device_pg0(ioc,
2026 &port_info->phy_info[i].attached,
2027 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2028 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2029 port_info->phy_info[i].attached.handle);
2032 mptsas_setup_wide_ports(ioc, port_info);
2034 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2035 mptsas_probe_one_phy(&ioc->sh->shost_gendev,
2036 &port_info->phy_info[i], ioc->sas_index, 1);
2047 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
2049 struct mptsas_portinfo *port_info, *p, *ex;
2050 struct device *parent;
2051 struct sas_rphy *rphy;
2052 int error = -ENOMEM, i, j;
2054 ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
2058 error = mptsas_sas_expander_pg0(ioc, ex,
2059 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
2060 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
2062 goto out_free_port_info;
2064 *handle = ex->phy_info[0].handle;
2066 mutex_lock(&ioc->sas_topology_mutex);
2067 port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
2070 list_add_tail(&port_info->list, &ioc->sas_topology);
2072 for (i = 0; i < ex->num_phys; i++) {
2073 port_info->phy_info[i].handle =
2074 ex->phy_info[i].handle;
2075 port_info->phy_info[i].port_id =
2076 ex->phy_info[i].port_id;
2078 kfree(ex->phy_info);
2082 mutex_unlock(&ioc->sas_topology_mutex);
2084 for (i = 0; i < port_info->num_phys; i++) {
2085 mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
2086 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
2087 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
2089 if (port_info->phy_info[i].identify.handle) {
2090 mptsas_sas_device_pg0(ioc,
2091 &port_info->phy_info[i].identify,
2092 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2093 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2094 port_info->phy_info[i].identify.handle);
2095 port_info->phy_info[i].identify.phy_id =
2096 port_info->phy_info[i].phy_id;
2099 if (port_info->phy_info[i].attached.handle) {
2100 mptsas_sas_device_pg0(ioc,
2101 &port_info->phy_info[i].attached,
2102 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2103 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2104 port_info->phy_info[i].attached.handle);
2105 port_info->phy_info[i].attached.phy_id =
2106 port_info->phy_info[i].phy_id;
2110 parent = &ioc->sh->shost_gendev;
2111 for (i = 0; i < port_info->num_phys; i++) {
2112 mutex_lock(&ioc->sas_topology_mutex);
2113 list_for_each_entry(p, &ioc->sas_topology, list) {
2114 for (j = 0; j < p->num_phys; j++) {
2115 if (port_info->phy_info[i].identify.handle !=
2116 p->phy_info[j].attached.handle)
2118 rphy = mptsas_get_rphy(&p->phy_info[j]);
2119 parent = &rphy->dev;
2122 mutex_unlock(&ioc->sas_topology_mutex);
2125 mptsas_setup_wide_ports(ioc, port_info);
2127 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2128 mptsas_probe_one_phy(parent, &port_info->phy_info[i],
2135 kfree(ex->phy_info);
2143 * mptsas_delete_expander_phys
2146 * This will traverse topology, and remove expanders
2147 * that are no longer present
2150 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
2152 struct mptsas_portinfo buffer;
2153 struct mptsas_portinfo *port_info, *n, *parent;
2154 struct mptsas_phyinfo *phy_info;
2155 struct sas_port * port;
2157 u64 expander_sas_address;
2159 mutex_lock(&ioc->sas_topology_mutex);
2160 list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
2162 if (port_info->phy_info &&
2163 (!(port_info->phy_info[0].identify.device_info &
2164 MPI_SAS_DEVICE_INFO_SMP_TARGET)))
2167 if (mptsas_sas_expander_pg0(ioc, &buffer,
2168 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
2169 MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
2170 port_info->phy_info[0].handle)) {
2173 * Obtain the port_info instance to the parent port
2175 parent = mptsas_find_portinfo_by_handle(ioc,
2176 port_info->phy_info[0].identify.handle_parent);
2181 expander_sas_address =
2182 port_info->phy_info[0].identify.sas_address;
2185 * Delete rphys in the parent that point
2186 * to this expander. The transport layer will
2187 * cleanup all the children.
2189 phy_info = parent->phy_info;
2190 for (i = 0; i < parent->num_phys; i++, phy_info++) {
2191 port = mptsas_get_port(phy_info);
2194 if (phy_info->attached.sas_address !=
2195 expander_sas_address)
2197 #ifdef MPT_DEBUG_SAS_WIDE
2198 dev_printk(KERN_DEBUG, &port->dev,
2199 "delete port (%d)\n", port->port_identifier);
2201 sas_port_delete(port);
2202 mptsas_port_delete(phy_info->port_details);
2206 phy_info = port_info->phy_info;
2207 for (i = 0; i < port_info->num_phys; i++, phy_info++)
2208 mptsas_port_delete(phy_info->port_details);
2210 list_del(&port_info->list);
2211 kfree(port_info->phy_info);
2215 * Free this memory allocated from inside
2216 * mptsas_sas_expander_pg0
2218 kfree(buffer.phy_info);
2220 mutex_unlock(&ioc->sas_topology_mutex);
2224 * Start of day discovery
2227 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
2229 u32 handle = 0xFFFF;
2232 mutex_lock(&ioc->sas_discovery_mutex);
2233 mptsas_probe_hba_phys(ioc);
2234 while (!mptsas_probe_expander_phys(ioc, &handle))
2237 Reporting RAID volumes.
2239 if (!ioc->ir_firmware)
2241 if (!ioc->raid_data.pIocPg2)
2243 if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
2245 for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
2246 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
2247 ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
2250 mutex_unlock(&ioc->sas_discovery_mutex);
2254 * Work queue thread to handle Runtime discovery
2255 * Mere purpose is the hot add/delete of expanders
2259 __mptsas_discovery_work(MPT_ADAPTER *ioc)
2261 u32 handle = 0xFFFF;
2263 ioc->sas_discovery_runtime=1;
2264 mptsas_delete_expander_phys(ioc);
2265 mptsas_probe_hba_phys(ioc);
2266 while (!mptsas_probe_expander_phys(ioc, &handle))
2268 ioc->sas_discovery_runtime=0;
2272 * Work queue thread to handle Runtime discovery
2273 * Mere purpose is the hot add/delete of expanders
2277 mptsas_discovery_work(struct work_struct *work)
2279 struct mptsas_discovery_event *ev =
2280 container_of(work, struct mptsas_discovery_event, work);
2281 MPT_ADAPTER *ioc = ev->ioc;
2283 mutex_lock(&ioc->sas_discovery_mutex);
2284 __mptsas_discovery_work(ioc);
2285 mutex_unlock(&ioc->sas_discovery_mutex);
2289 static struct mptsas_phyinfo *
2290 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
2292 struct mptsas_portinfo *port_info;
2293 struct mptsas_phyinfo *phy_info = NULL;
2296 mutex_lock(&ioc->sas_topology_mutex);
2297 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2298 for (i = 0; i < port_info->num_phys; i++) {
2299 if (!mptsas_is_end_device(
2300 &port_info->phy_info[i].attached))
2302 if (port_info->phy_info[i].attached.sas_address
2305 phy_info = &port_info->phy_info[i];
2309 mutex_unlock(&ioc->sas_topology_mutex);
2313 static struct mptsas_phyinfo *
2314 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
2316 struct mptsas_portinfo *port_info;
2317 struct mptsas_phyinfo *phy_info = NULL;
2320 mutex_lock(&ioc->sas_topology_mutex);
2321 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2322 for (i = 0; i < port_info->num_phys; i++) {
2323 if (!mptsas_is_end_device(
2324 &port_info->phy_info[i].attached))
2326 if (port_info->phy_info[i].attached.id != id)
2328 if (port_info->phy_info[i].attached.channel != channel)
2330 phy_info = &port_info->phy_info[i];
2334 mutex_unlock(&ioc->sas_topology_mutex);
2338 static struct mptsas_phyinfo *
2339 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
2341 struct mptsas_portinfo *port_info;
2342 struct mptsas_phyinfo *phy_info = NULL;
2345 mutex_lock(&ioc->sas_topology_mutex);
2346 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2347 for (i = 0; i < port_info->num_phys; i++) {
2348 if (!mptsas_is_end_device(
2349 &port_info->phy_info[i].attached))
2351 if (port_info->phy_info[i].attached.phys_disk_num == ~0)
2353 if (port_info->phy_info[i].attached.phys_disk_num != id)
2355 if (port_info->phy_info[i].attached.channel != channel)
2357 phy_info = &port_info->phy_info[i];
2361 mutex_unlock(&ioc->sas_topology_mutex);
2366 * Work queue thread to clear the persitency table
2369 mptsas_persist_clear_table(struct work_struct *work)
2371 MPT_ADAPTER *ioc = container_of(work, MPT_ADAPTER, sas_persist_task);
2373 mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
2377 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
2381 sdev->no_uld_attach = data ? 1 : 0;
2382 rc = scsi_device_reprobe(sdev);
2386 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
2388 starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
2389 mptsas_reprobe_lun);
2393 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
2396 ConfigPageHeader_t hdr;
2397 dma_addr_t dma_handle;
2398 pRaidVolumePage0_t buffer = NULL;
2399 RaidPhysDiskPage0_t phys_disk;
2401 struct mptsas_hotplug_event *ev;
2403 memset(&cfg, 0 , sizeof(CONFIGPARMS));
2404 memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
2405 hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
2406 cfg.pageAddr = (channel << 8) + id;
2407 cfg.cfghdr.hdr = &hdr;
2408 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2410 if (mpt_config(ioc, &cfg) != 0)
2413 if (!hdr.PageLength)
2416 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
2422 cfg.physAddr = dma_handle;
2423 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2425 if (mpt_config(ioc, &cfg) != 0)
2428 if (!(buffer->VolumeStatus.Flags &
2429 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
2432 if (!buffer->NumPhysDisks)
2435 for (i = 0; i < buffer->NumPhysDisks; i++) {
2437 if (mpt_raid_phys_disk_pg0(ioc,
2438 buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
2441 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2443 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2447 INIT_WORK(&ev->work, mptsas_hotplug_work);
2449 ev->id = phys_disk.PhysDiskID;
2450 ev->channel = phys_disk.PhysDiskBus;
2451 ev->phys_disk_num_valid = 1;
2452 ev->phys_disk_num = phys_disk.PhysDiskNum;
2453 ev->event_type = MPTSAS_ADD_DEVICE;
2454 schedule_work(&ev->work);
2459 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
2463 * Work queue thread to handle SAS hotplug events
2466 mptsas_hotplug_work(struct work_struct *work)
2468 struct mptsas_hotplug_event *ev =
2469 container_of(work, struct mptsas_hotplug_event, work);
2471 MPT_ADAPTER *ioc = ev->ioc;
2472 struct mptsas_phyinfo *phy_info;
2473 struct sas_rphy *rphy;
2474 struct sas_port *port;
2475 struct scsi_device *sdev;
2476 struct scsi_target * starget;
2477 struct sas_identify identify;
2479 struct mptsas_devinfo sas_device;
2480 VirtTarget *vtarget;
2481 VirtDevice *vdevice;
2483 mutex_lock(&ioc->sas_discovery_mutex);
2484 switch (ev->event_type) {
2485 case MPTSAS_DEL_DEVICE:
2488 if (ev->phys_disk_num_valid) {
2489 if (ev->hidden_raid_component){
2490 if (mptsas_sas_device_pg0(ioc, &sas_device,
2491 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2492 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2493 (ev->channel << 8) + ev->id)) {
2494 dfailprintk((MYIOC_s_ERR_FMT
2495 "%s: exit at line=%d\n", ioc->name,
2496 __FUNCTION__, __LINE__));
2499 phy_info = mptsas_find_phyinfo_by_sas_address(
2500 ioc, sas_device.sas_address);
2502 phy_info = mptsas_find_phyinfo_by_phys_disk_num(
2503 ioc, ev->channel, ev->phys_disk_num);
2507 phy_info = mptsas_find_phyinfo_by_target(ioc,
2508 ev->channel, ev->id);
2511 * Sanity checks, for non-existing phys and remote rphys.
2514 dfailprintk((MYIOC_s_ERR_FMT
2515 "%s: exit at line=%d\n", ioc->name,
2516 __FUNCTION__, __LINE__));
2519 if (!phy_info->port_details) {
2520 dfailprintk((MYIOC_s_ERR_FMT
2521 "%s: exit at line=%d\n", ioc->name,
2522 __FUNCTION__, __LINE__));
2525 rphy = mptsas_get_rphy(phy_info);
2527 dfailprintk((MYIOC_s_ERR_FMT
2528 "%s: exit at line=%d\n", ioc->name,
2529 __FUNCTION__, __LINE__));
2533 port = mptsas_get_port(phy_info);
2535 dfailprintk((MYIOC_s_ERR_FMT
2536 "%s: exit at line=%d\n", ioc->name,
2537 __FUNCTION__, __LINE__));
2541 starget = mptsas_get_starget(phy_info);
2543 vtarget = starget->hostdata;
2546 dfailprintk((MYIOC_s_ERR_FMT
2547 "%s: exit at line=%d\n", ioc->name,
2548 __FUNCTION__, __LINE__));
2553 * Handling RAID components
2555 if (ev->phys_disk_num_valid &&
2556 ev->hidden_raid_component) {
2557 printk(MYIOC_s_INFO_FMT
2558 "RAID Hidding: channel=%d, id=%d, "
2559 "physdsk %d \n", ioc->name, ev->channel,
2560 ev->id, ev->phys_disk_num);
2561 vtarget->id = ev->phys_disk_num;
2563 MPT_TARGET_FLAGS_RAID_COMPONENT;
2564 mptsas_reprobe_target(starget, 1);
2565 phy_info->attached.phys_disk_num =
2571 if (phy_info->attached.device_info &
2572 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2574 if (phy_info->attached.device_info &
2575 MPI_SAS_DEVICE_INFO_STP_TARGET)
2577 if (phy_info->attached.device_info &
2578 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2581 printk(MYIOC_s_INFO_FMT
2582 "removing %s device, channel %d, id %d, phy %d\n",
2583 ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
2584 #ifdef MPT_DEBUG_SAS_WIDE
2585 dev_printk(KERN_DEBUG, &port->dev,
2586 "delete port (%d)\n", port->port_identifier);
2588 sas_port_delete(port);
2589 mptsas_port_delete(phy_info->port_details);
2591 case MPTSAS_ADD_DEVICE:
2593 if (ev->phys_disk_num_valid)
2594 mpt_findImVolumes(ioc);
2597 * Refresh sas device pg0 data
2599 if (mptsas_sas_device_pg0(ioc, &sas_device,
2600 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2601 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2602 (ev->channel << 8) + ev->id)) {
2603 dfailprintk((MYIOC_s_ERR_FMT
2604 "%s: exit at line=%d\n", ioc->name,
2605 __FUNCTION__, __LINE__));
2609 __mptsas_discovery_work(ioc);
2611 phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
2612 sas_device.sas_address);
2614 if (!phy_info || !phy_info->port_details) {
2615 dfailprintk((MYIOC_s_ERR_FMT
2616 "%s: exit at line=%d\n", ioc->name,
2617 __FUNCTION__, __LINE__));
2621 starget = mptsas_get_starget(phy_info);
2622 if (starget && (!ev->hidden_raid_component)){
2624 vtarget = starget->hostdata;
2627 dfailprintk((MYIOC_s_ERR_FMT
2628 "%s: exit at line=%d\n", ioc->name,
2629 __FUNCTION__, __LINE__));
2633 * Handling RAID components
2635 if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2636 printk(MYIOC_s_INFO_FMT
2637 "RAID Exposing: channel=%d, id=%d, "
2638 "physdsk %d \n", ioc->name, ev->channel,
2639 ev->id, ev->phys_disk_num);
2641 ~MPT_TARGET_FLAGS_RAID_COMPONENT;
2642 vtarget->id = ev->id;
2643 mptsas_reprobe_target(starget, 0);
2644 phy_info->attached.phys_disk_num = ~0;
2649 if (mptsas_get_rphy(phy_info)) {
2650 dfailprintk((MYIOC_s_ERR_FMT
2651 "%s: exit at line=%d\n", ioc->name,
2652 __FUNCTION__, __LINE__));
2653 if (ev->channel) printk("%d\n", __LINE__);
2657 port = mptsas_get_port(phy_info);
2659 dfailprintk((MYIOC_s_ERR_FMT
2660 "%s: exit at line=%d\n", ioc->name,
2661 __FUNCTION__, __LINE__));
2664 memcpy(&phy_info->attached, &sas_device,
2665 sizeof(struct mptsas_devinfo));
2667 if (phy_info->attached.device_info &
2668 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2670 if (phy_info->attached.device_info &
2671 MPI_SAS_DEVICE_INFO_STP_TARGET)
2673 if (phy_info->attached.device_info &
2674 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2677 printk(MYIOC_s_INFO_FMT
2678 "attaching %s device, channel %d, id %d, phy %d\n",
2679 ioc->name, ds, ev->channel, ev->id, ev->phy_id);
2681 mptsas_parse_device_info(&identify, &phy_info->attached);
2682 rphy = sas_end_device_alloc(port);
2684 dfailprintk((MYIOC_s_ERR_FMT
2685 "%s: exit at line=%d\n", ioc->name,
2686 __FUNCTION__, __LINE__));
2687 break; /* non-fatal: an rphy can be added later */
2690 rphy->identify = identify;
2691 if (sas_rphy_add(rphy)) {
2692 dfailprintk((MYIOC_s_ERR_FMT
2693 "%s: exit at line=%d\n", ioc->name,
2694 __FUNCTION__, __LINE__));
2695 sas_rphy_free(rphy);
2698 mptsas_set_rphy(phy_info, rphy);
2700 case MPTSAS_ADD_RAID:
2701 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2704 scsi_device_put(sdev);
2707 printk(MYIOC_s_INFO_FMT
2708 "attaching raid volume, channel %d, id %d\n",
2709 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2710 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
2711 mpt_findImVolumes(ioc);
2713 case MPTSAS_DEL_RAID:
2714 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2718 printk(MYIOC_s_INFO_FMT
2719 "removing raid volume, channel %d, id %d\n",
2720 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2721 vdevice = sdev->hostdata;
2722 scsi_remove_device(sdev);
2723 scsi_device_put(sdev);
2724 mpt_findImVolumes(ioc);
2726 case MPTSAS_ADD_INACTIVE_VOLUME:
2727 mptsas_adding_inactive_raid_components(ioc,
2728 ev->channel, ev->id);
2730 case MPTSAS_IGNORE_EVENT:
2735 mutex_unlock(&ioc->sas_discovery_mutex);
2740 mptsas_send_sas_event(MPT_ADAPTER *ioc,
2741 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
2743 struct mptsas_hotplug_event *ev;
2744 u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
2748 (MPI_SAS_DEVICE_INFO_SSP_TARGET |
2749 MPI_SAS_DEVICE_INFO_STP_TARGET |
2750 MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
2753 switch (sas_event_data->ReasonCode) {
2754 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
2756 mptsas_target_reset_queue(ioc, sas_event_data);
2759 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
2760 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2762 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2766 INIT_WORK(&ev->work, mptsas_hotplug_work);
2768 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
2770 le16_to_cpu(sas_event_data->ParentDevHandle);
2771 ev->channel = sas_event_data->Bus;
2772 ev->id = sas_event_data->TargetID;
2773 ev->phy_id = sas_event_data->PhyNum;
2774 memcpy(&sas_address, &sas_event_data->SASAddress,
2776 ev->sas_address = le64_to_cpu(sas_address);
2777 ev->device_info = device_info;
2779 if (sas_event_data->ReasonCode &
2780 MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
2781 ev->event_type = MPTSAS_ADD_DEVICE;
2783 ev->event_type = MPTSAS_DEL_DEVICE;
2784 schedule_work(&ev->work);
2786 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
2788 * Persistent table is full.
2790 INIT_WORK(&ioc->sas_persist_task,
2791 mptsas_persist_clear_table);
2792 schedule_work(&ioc->sas_persist_task);
2795 * TODO, handle other events
2797 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
2798 case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
2799 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
2800 case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
2801 case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
2802 case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
2803 case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
2809 mptsas_send_raid_event(MPT_ADAPTER *ioc,
2810 EVENT_DATA_RAID *raid_event_data)
2812 struct mptsas_hotplug_event *ev;
2813 int status = le32_to_cpu(raid_event_data->SettingsStatus);
2814 int state = (status >> 8) & 0xff;
2816 if (ioc->bus_type != SAS)
2819 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2821 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2825 INIT_WORK(&ev->work, mptsas_hotplug_work);
2827 ev->id = raid_event_data->VolumeID;
2828 ev->channel = raid_event_data->VolumeBus;
2829 ev->event_type = MPTSAS_IGNORE_EVENT;
2831 switch (raid_event_data->ReasonCode) {
2832 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
2833 ev->phys_disk_num_valid = 1;
2834 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2835 ev->event_type = MPTSAS_ADD_DEVICE;
2837 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
2838 ev->phys_disk_num_valid = 1;
2839 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2840 ev->hidden_raid_component = 1;
2841 ev->event_type = MPTSAS_DEL_DEVICE;
2843 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
2845 case MPI_PD_STATE_ONLINE:
2846 case MPI_PD_STATE_NOT_COMPATIBLE:
2847 ev->phys_disk_num_valid = 1;
2848 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2849 ev->hidden_raid_component = 1;
2850 ev->event_type = MPTSAS_ADD_DEVICE;
2852 case MPI_PD_STATE_MISSING:
2853 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
2854 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
2855 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
2856 ev->phys_disk_num_valid = 1;
2857 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2858 ev->event_type = MPTSAS_DEL_DEVICE;
2864 case MPI_EVENT_RAID_RC_VOLUME_DELETED:
2865 ev->event_type = MPTSAS_DEL_RAID;
2867 case MPI_EVENT_RAID_RC_VOLUME_CREATED:
2868 ev->event_type = MPTSAS_ADD_RAID;
2870 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
2872 case MPI_RAIDVOL0_STATUS_STATE_FAILED:
2873 case MPI_RAIDVOL0_STATUS_STATE_MISSING:
2874 ev->event_type = MPTSAS_DEL_RAID;
2876 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
2877 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
2878 ev->event_type = MPTSAS_ADD_RAID;
2887 schedule_work(&ev->work);
2891 mptsas_send_discovery_event(MPT_ADAPTER *ioc,
2892 EVENT_DATA_SAS_DISCOVERY *discovery_data)
2894 struct mptsas_discovery_event *ev;
2899 * This flag will be non-zero when firmware
2900 * kicks off discovery, and return to zero
2901 * once its completed.
2903 if (discovery_data->DiscoveryStatus)
2906 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2909 INIT_WORK(&ev->work, mptsas_discovery_work);
2911 schedule_work(&ev->work);
2915 * mptsas_send_ir2_event - handle exposing hidden disk when
2916 * an inactive raid volume is added
2918 * @ioc: Pointer to MPT_ADAPTER structure
2923 mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
2925 struct mptsas_hotplug_event *ev;
2927 if (ir2_data->ReasonCode !=
2928 MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
2931 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2935 INIT_WORK(&ev->work, mptsas_hotplug_work);
2937 ev->id = ir2_data->TargetID;
2938 ev->channel = ir2_data->Bus;
2939 ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
2941 schedule_work(&ev->work);
2945 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
2948 u8 event = le32_to_cpu(reply->Event) & 0xFF;
2954 * sas_discovery_ignore_events
2956 * This flag is to prevent anymore processing of
2957 * sas events once mptsas_remove function is called.
2959 if (ioc->sas_discovery_ignore_events) {
2960 rc = mptscsih_event_process(ioc, reply);
2965 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
2966 mptsas_send_sas_event(ioc,
2967 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
2969 case MPI_EVENT_INTEGRATED_RAID:
2970 mptsas_send_raid_event(ioc,
2971 (EVENT_DATA_RAID *)reply->Data);
2973 case MPI_EVENT_PERSISTENT_TABLE_FULL:
2974 INIT_WORK(&ioc->sas_persist_task,
2975 mptsas_persist_clear_table);
2976 schedule_work(&ioc->sas_persist_task);
2978 case MPI_EVENT_SAS_DISCOVERY:
2979 mptsas_send_discovery_event(ioc,
2980 (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
2983 mptsas_send_ir2_event(ioc,
2984 (PTR_MPI_EVENT_DATA_IR2)reply->Data);
2987 rc = mptscsih_event_process(ioc, reply);
2996 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2998 struct Scsi_Host *sh;
3001 unsigned long flags;
3009 r = mpt_attach(pdev,id);
3013 ioc = pci_get_drvdata(pdev);
3014 ioc->DoneCtx = mptsasDoneCtx;
3015 ioc->TaskCtx = mptsasTaskCtx;
3016 ioc->InternalCtx = mptsasInternalCtx;
3018 /* Added sanity check on readiness of the MPT adapter.
3020 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
3021 printk(MYIOC_s_WARN_FMT
3022 "Skipping because it's not operational!\n",
3025 goto out_mptsas_probe;
3029 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
3032 goto out_mptsas_probe;
3035 /* Sanity check - ensure at least 1 port is INITIATOR capable
3038 for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
3039 if (ioc->pfacts[ii].ProtocolFlags &
3040 MPI_PORTFACTS_PROTOCOL_INITIATOR)
3045 printk(MYIOC_s_WARN_FMT
3046 "Skipping ioc=%p because SCSI Initiator mode "
3047 "is NOT enabled!\n", ioc->name, ioc);
3051 sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
3053 printk(MYIOC_s_WARN_FMT
3054 "Unable to register controller with SCSI subsystem\n",
3057 goto out_mptsas_probe;
3060 spin_lock_irqsave(&ioc->FreeQlock, flags);
3062 /* Attach the SCSI Host to the IOC structure
3070 /* set 16 byte cdb's */
3071 sh->max_cmd_len = 16;
3073 sh->max_id = ioc->pfacts[0].PortSCSIID;
3074 sh->max_lun = max_lun;
3076 sh->transportt = mptsas_transport_template;
3078 sh->this_id = ioc->pfacts[0].PortSCSIID;
3082 sh->unique_id = ioc->id;
3084 INIT_LIST_HEAD(&ioc->sas_topology);
3085 mutex_init(&ioc->sas_topology_mutex);
3086 mutex_init(&ioc->sas_discovery_mutex);
3087 mutex_init(&ioc->sas_mgmt.mutex);
3088 init_completion(&ioc->sas_mgmt.done);
3090 /* Verify that we won't exceed the maximum
3091 * number of chain buffers
3092 * We can optimize: ZZ = req_sz/sizeof(SGE)
3094 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
3095 * + (req_sz - 64)/sizeof(SGE)
3096 * A slightly different algorithm is required for
3099 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
3100 if (sizeof(dma_addr_t) == sizeof(u64)) {
3101 numSGE = (scale - 1) *
3102 (ioc->facts.MaxChainDepth-1) + scale +
3103 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
3106 numSGE = 1 + (scale - 1) *
3107 (ioc->facts.MaxChainDepth-1) + scale +
3108 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
3112 if (numSGE < sh->sg_tablesize) {
3113 /* Reset this value */
3114 dprintk((MYIOC_s_INFO_FMT
3115 "Resetting sg_tablesize to %d from %d\n",
3116 ioc->name, numSGE, sh->sg_tablesize));
3117 sh->sg_tablesize = numSGE;
3120 hd = (MPT_SCSI_HOST *) sh->hostdata;
3123 /* SCSI needs scsi_cmnd lookup table!
3124 * (with size equal to req_depth*PtrSz!)
3126 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
3127 if (!hd->ScsiLookup) {
3129 goto out_mptsas_probe;
3132 dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
3133 ioc->name, hd->ScsiLookup));
3135 /* Clear the TM flags
3138 hd->tmState = TM_STATE_NONE;
3139 hd->resetPending = 0;
3140 hd->abortSCpnt = NULL;
3142 /* Clear the pointer used to store
3143 * single-threaded commands, i.e., those
3144 * issued during a bus scan, dv and
3145 * configuration pages.
3149 /* Initialize this SCSI Hosts' timers
3150 * To use, set the timer expires field
3153 init_timer(&hd->timer);
3154 hd->timer.data = (unsigned long) hd;
3155 hd->timer.function = mptscsih_timer_expired;
3157 ioc->sas_data.ptClear = mpt_pt_clear;
3159 init_waitqueue_head(&hd->scandv_waitq);
3160 hd->scandv_wait_done = 0;
3161 hd->last_queue_full = 0;
3162 INIT_LIST_HEAD(&hd->target_reset_list);
3163 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3165 if (ioc->sas_data.ptClear==1) {
3166 mptbase_sas_persist_operation(
3167 ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
3170 error = scsi_add_host(sh, &ioc->pcidev->dev);
3172 dprintk((KERN_ERR MYNAM
3173 "scsi_add_host failed\n"));
3174 goto out_mptsas_probe;
3177 mptsas_scan_sas_topology(ioc);
3183 mptscsih_remove(pdev);
3187 static void __devexit mptsas_remove(struct pci_dev *pdev)
3189 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
3190 struct mptsas_portinfo *p, *n;
3193 ioc->sas_discovery_ignore_events = 1;
3194 sas_remove_host(ioc->sh);
3196 mutex_lock(&ioc->sas_topology_mutex);
3197 list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
3199 for (i = 0 ; i < p->num_phys ; i++)
3200 mptsas_port_delete(p->phy_info[i].port_details);
3204 mutex_unlock(&ioc->sas_topology_mutex);
3206 mptscsih_remove(pdev);
3209 static struct pci_device_id mptsas_pci_table[] = {
3210 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
3211 PCI_ANY_ID, PCI_ANY_ID },
3212 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
3213 PCI_ANY_ID, PCI_ANY_ID },
3214 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
3215 PCI_ANY_ID, PCI_ANY_ID },
3216 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
3217 PCI_ANY_ID, PCI_ANY_ID },
3218 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
3219 PCI_ANY_ID, PCI_ANY_ID },
3220 {0} /* Terminating entry */
3222 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
3225 static struct pci_driver mptsas_driver = {
3227 .id_table = mptsas_pci_table,
3228 .probe = mptsas_probe,
3229 .remove = __devexit_p(mptsas_remove),
3230 .shutdown = mptscsih_shutdown,
3232 .suspend = mptscsih_suspend,
3233 .resume = mptscsih_resume,
3240 show_mptmod_ver(my_NAME, my_VERSION);
3242 mptsas_transport_template =
3243 sas_attach_transport(&mptsas_transport_functions);
3244 if (!mptsas_transport_template)
3247 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
3248 mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
3250 mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
3251 mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
3253 if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) {
3254 devtverboseprintk((KERN_INFO MYNAM
3255 ": Registered for IOC event notifications\n"));
3258 if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
3259 dprintk((KERN_INFO MYNAM
3260 ": Registered for IOC reset notifications\n"));
3263 return pci_register_driver(&mptsas_driver);
3269 pci_unregister_driver(&mptsas_driver);
3270 sas_release_transport(mptsas_transport_template);
3272 mpt_reset_deregister(mptsasDoneCtx);
3273 mpt_event_deregister(mptsasDoneCtx);
3275 mpt_deregister(mptsasMgmtCtx);
3276 mpt_deregister(mptsasInternalCtx);
3277 mpt_deregister(mptsasTaskCtx);
3278 mpt_deregister(mptsasDoneCtx);
3281 module_init(mptsas_init);
3282 module_exit(mptsas_exit);