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/sched.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)
818 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
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)
833 if (list_empty(&hd->target_reset_list))
836 /* flush the target_reset_list */
837 list_for_each_entry_safe(target_reset_list, n,
838 &hd->target_reset_list, list) {
839 list_del(&target_reset_list->list);
840 kfree(target_reset_list);
848 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
849 u32 form, u32 form_specific)
851 ConfigExtendedPageHeader_t hdr;
853 SasEnclosurePage0_t *buffer;
854 dma_addr_t dma_handle;
856 __le64 le_identifier;
858 memset(&hdr, 0, sizeof(hdr));
859 hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
861 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
862 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
864 cfg.cfghdr.ehdr = &hdr;
866 cfg.pageAddr = form + form_specific;
867 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
868 cfg.dir = 0; /* read */
871 error = mpt_config(ioc, &cfg);
874 if (!hdr.ExtPageLength) {
879 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
886 cfg.physAddr = dma_handle;
887 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
889 error = mpt_config(ioc, &cfg);
891 goto out_free_consistent;
893 /* save config data */
894 memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
895 enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
896 enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
897 enclosure->flags = le16_to_cpu(buffer->Flags);
898 enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
899 enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
900 enclosure->start_id = buffer->StartTargetID;
901 enclosure->start_channel = buffer->StartBus;
902 enclosure->sep_id = buffer->SEPTargetID;
903 enclosure->sep_channel = buffer->SEPBus;
906 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
913 mptsas_slave_configure(struct scsi_device *sdev)
916 if (sdev->channel == MPTSAS_RAID_CHANNEL)
919 sas_read_port_mode_page(sdev);
922 return mptscsih_slave_configure(sdev);
926 mptsas_target_alloc(struct scsi_target *starget)
928 struct Scsi_Host *host = dev_to_shost(&starget->dev);
929 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
932 struct sas_rphy *rphy;
933 struct mptsas_portinfo *p;
936 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
940 vtarget->starget = starget;
941 vtarget->ioc_id = hd->ioc->id;
942 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
947 * RAID volumes placed beyond the last expected port.
949 if (starget->channel == MPTSAS_RAID_CHANNEL) {
950 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
951 if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
952 channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
956 rphy = dev_to_rphy(starget->dev.parent);
957 mutex_lock(&hd->ioc->sas_topology_mutex);
958 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
959 for (i = 0; i < p->num_phys; i++) {
960 if (p->phy_info[i].attached.sas_address !=
961 rphy->identify.sas_address)
963 id = p->phy_info[i].attached.id;
964 channel = p->phy_info[i].attached.channel;
965 mptsas_set_starget(&p->phy_info[i], starget);
968 * Exposing hidden raid components
970 if (mptscsih_is_phys_disk(hd->ioc, channel, id)) {
971 id = mptscsih_raid_id_to_num(hd->ioc,
974 MPT_TARGET_FLAGS_RAID_COMPONENT;
975 p->phy_info[i].attached.phys_disk_num = id;
977 mutex_unlock(&hd->ioc->sas_topology_mutex);
981 mutex_unlock(&hd->ioc->sas_topology_mutex);
988 vtarget->channel = channel;
989 starget->hostdata = vtarget;
994 mptsas_target_destroy(struct scsi_target *starget)
996 struct Scsi_Host *host = dev_to_shost(&starget->dev);
997 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
998 struct sas_rphy *rphy;
999 struct mptsas_portinfo *p;
1002 if (!starget->hostdata)
1005 if (starget->channel == MPTSAS_RAID_CHANNEL)
1008 rphy = dev_to_rphy(starget->dev.parent);
1009 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1010 for (i = 0; i < p->num_phys; i++) {
1011 if (p->phy_info[i].attached.sas_address !=
1012 rphy->identify.sas_address)
1014 mptsas_set_starget(&p->phy_info[i], NULL);
1020 kfree(starget->hostdata);
1021 starget->hostdata = NULL;
1026 mptsas_slave_alloc(struct scsi_device *sdev)
1028 struct Scsi_Host *host = sdev->host;
1029 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
1030 struct sas_rphy *rphy;
1031 struct mptsas_portinfo *p;
1033 struct scsi_target *starget;
1036 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
1038 printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
1039 hd->ioc->name, sizeof(VirtDevice));
1042 starget = scsi_target(sdev);
1043 vdev->vtarget = starget->hostdata;
1045 if (sdev->channel == MPTSAS_RAID_CHANNEL)
1048 rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
1049 mutex_lock(&hd->ioc->sas_topology_mutex);
1050 list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1051 for (i = 0; i < p->num_phys; i++) {
1052 if (p->phy_info[i].attached.sas_address !=
1053 rphy->identify.sas_address)
1055 vdev->lun = sdev->lun;
1057 * Exposing hidden raid components
1059 if (mptscsih_is_phys_disk(hd->ioc,
1060 p->phy_info[i].attached.channel,
1061 p->phy_info[i].attached.id))
1062 sdev->no_uld_attach = 1;
1063 mutex_unlock(&hd->ioc->sas_topology_mutex);
1067 mutex_unlock(&hd->ioc->sas_topology_mutex);
1073 vdev->vtarget->num_luns++;
1074 sdev->hostdata = vdev;
1079 mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1081 VirtDevice *vdev = SCpnt->device->hostdata;
1083 if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) {
1084 SCpnt->result = DID_NO_CONNECT << 16;
1089 // scsi_print_command(SCpnt);
1091 return mptscsih_qcmd(SCpnt,done);
1095 static struct scsi_host_template mptsas_driver_template = {
1096 .module = THIS_MODULE,
1097 .proc_name = "mptsas",
1098 .proc_info = mptscsih_proc_info,
1099 .name = "MPT SPI Host",
1100 .info = mptscsih_info,
1101 .queuecommand = mptsas_qcmd,
1102 .target_alloc = mptsas_target_alloc,
1103 .slave_alloc = mptsas_slave_alloc,
1104 .slave_configure = mptsas_slave_configure,
1105 .target_destroy = mptsas_target_destroy,
1106 .slave_destroy = mptscsih_slave_destroy,
1107 .change_queue_depth = mptscsih_change_queue_depth,
1108 .eh_abort_handler = mptscsih_abort,
1109 .eh_device_reset_handler = mptscsih_dev_reset,
1110 .eh_bus_reset_handler = mptscsih_bus_reset,
1111 .eh_host_reset_handler = mptscsih_host_reset,
1112 .bios_param = mptscsih_bios_param,
1113 .can_queue = MPT_FC_CAN_QUEUE,
1115 .sg_tablesize = MPT_SCSI_SG_DEPTH,
1116 .max_sectors = 8192,
1118 .use_clustering = ENABLE_CLUSTERING,
1121 static int mptsas_get_linkerrors(struct sas_phy *phy)
1123 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1124 ConfigExtendedPageHeader_t hdr;
1126 SasPhyPage1_t *buffer;
1127 dma_addr_t dma_handle;
1130 /* FIXME: only have link errors on local phys */
1131 if (!scsi_is_sas_phy_local(phy))
1134 hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
1135 hdr.ExtPageLength = 0;
1136 hdr.PageNumber = 1 /* page number 1*/;
1139 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1140 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1142 cfg.cfghdr.ehdr = &hdr;
1144 cfg.pageAddr = phy->identify.phy_identifier;
1145 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1146 cfg.dir = 0; /* read */
1149 error = mpt_config(ioc, &cfg);
1152 if (!hdr.ExtPageLength)
1155 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1160 cfg.physAddr = dma_handle;
1161 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1163 error = mpt_config(ioc, &cfg);
1165 goto out_free_consistent;
1167 mptsas_print_phy_pg1(buffer);
1169 phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
1170 phy->running_disparity_error_count =
1171 le32_to_cpu(buffer->RunningDisparityErrorCount);
1172 phy->loss_of_dword_sync_count =
1173 le32_to_cpu(buffer->LossDwordSynchCount);
1174 phy->phy_reset_problem_count =
1175 le32_to_cpu(buffer->PhyResetProblemCount);
1177 out_free_consistent:
1178 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1179 buffer, dma_handle);
1183 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
1184 MPT_FRAME_HDR *reply)
1186 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
1187 if (reply != NULL) {
1188 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
1189 memcpy(ioc->sas_mgmt.reply, reply,
1190 min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
1192 complete(&ioc->sas_mgmt.done);
1196 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
1198 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1199 SasIoUnitControlRequest_t *req;
1200 SasIoUnitControlReply_t *reply;
1203 unsigned long timeleft;
1204 int error = -ERESTARTSYS;
1206 /* FIXME: fusion doesn't allow non-local phy reset */
1207 if (!scsi_is_sas_phy_local(phy))
1210 /* not implemented for expanders */
1211 if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
1214 if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
1217 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1223 hdr = (MPIHeader_t *) mf;
1224 req = (SasIoUnitControlRequest_t *)mf;
1225 memset(req, 0, sizeof(SasIoUnitControlRequest_t));
1226 req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
1227 req->MsgContext = hdr->MsgContext;
1228 req->Operation = hard_reset ?
1229 MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
1230 req->PhyNum = phy->identify.phy_identifier;
1232 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1234 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
1237 /* On timeout reset the board */
1238 mpt_free_msg_frame(ioc, mf);
1239 mpt_HardResetHandler(ioc, CAN_SLEEP);
1244 /* a reply frame is expected */
1245 if ((ioc->sas_mgmt.status &
1246 MPT_IOCTL_STATUS_RF_VALID) == 0) {
1251 /* process the completed Reply Message Frame */
1252 reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
1253 if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
1254 printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
1265 mutex_unlock(&ioc->sas_mgmt.mutex);
1271 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
1273 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1275 struct mptsas_portinfo *p;
1276 struct mptsas_enclosure enclosure_info;
1277 u64 enclosure_handle;
1279 mutex_lock(&ioc->sas_topology_mutex);
1280 list_for_each_entry(p, &ioc->sas_topology, list) {
1281 for (i = 0; i < p->num_phys; i++) {
1282 if (p->phy_info[i].attached.sas_address ==
1283 rphy->identify.sas_address) {
1284 enclosure_handle = p->phy_info[i].
1285 attached.handle_enclosure;
1290 mutex_unlock(&ioc->sas_topology_mutex);
1294 mutex_unlock(&ioc->sas_topology_mutex);
1295 memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
1296 error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
1297 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
1298 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
1300 *identifier = enclosure_info.enclosure_logical_id;
1305 mptsas_get_bay_identifier(struct sas_rphy *rphy)
1307 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1308 struct mptsas_portinfo *p;
1311 mutex_lock(&ioc->sas_topology_mutex);
1312 list_for_each_entry(p, &ioc->sas_topology, list) {
1313 for (i = 0; i < p->num_phys; i++) {
1314 if (p->phy_info[i].attached.sas_address ==
1315 rphy->identify.sas_address) {
1316 rc = p->phy_info[i].attached.slot;
1323 mutex_unlock(&ioc->sas_topology_mutex);
1327 static struct sas_function_template mptsas_transport_functions = {
1328 .get_linkerrors = mptsas_get_linkerrors,
1329 .get_enclosure_identifier = mptsas_get_enclosure_identifier,
1330 .get_bay_identifier = mptsas_get_bay_identifier,
1331 .phy_reset = mptsas_phy_reset,
1334 static struct scsi_transport_template *mptsas_transport_template;
1337 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
1339 ConfigExtendedPageHeader_t hdr;
1341 SasIOUnitPage0_t *buffer;
1342 dma_addr_t dma_handle;
1345 hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
1346 hdr.ExtPageLength = 0;
1350 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1351 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1353 cfg.cfghdr.ehdr = &hdr;
1356 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1357 cfg.dir = 0; /* read */
1360 error = mpt_config(ioc, &cfg);
1363 if (!hdr.ExtPageLength) {
1368 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1375 cfg.physAddr = dma_handle;
1376 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1378 error = mpt_config(ioc, &cfg);
1380 goto out_free_consistent;
1382 port_info->num_phys = buffer->NumPhys;
1383 port_info->phy_info = kcalloc(port_info->num_phys,
1384 sizeof(*port_info->phy_info),GFP_KERNEL);
1385 if (!port_info->phy_info) {
1387 goto out_free_consistent;
1390 for (i = 0; i < port_info->num_phys; i++) {
1391 mptsas_print_phy_data(&buffer->PhyData[i]);
1392 port_info->phy_info[i].phy_id = i;
1393 port_info->phy_info[i].port_id =
1394 buffer->PhyData[i].Port;
1395 port_info->phy_info[i].negotiated_link_rate =
1396 buffer->PhyData[i].NegotiatedLinkRate;
1397 port_info->phy_info[i].portinfo = port_info;
1398 port_info->phy_info[i].handle =
1399 le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
1402 out_free_consistent:
1403 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1404 buffer, dma_handle);
1410 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1411 u32 form, u32 form_specific)
1413 ConfigExtendedPageHeader_t hdr;
1415 SasPhyPage0_t *buffer;
1416 dma_addr_t dma_handle;
1419 hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
1420 hdr.ExtPageLength = 0;
1424 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1425 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1427 cfg.cfghdr.ehdr = &hdr;
1428 cfg.dir = 0; /* read */
1431 /* Get Phy Pg 0 for each Phy. */
1433 cfg.pageAddr = form + form_specific;
1434 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1436 error = mpt_config(ioc, &cfg);
1440 if (!hdr.ExtPageLength) {
1445 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1452 cfg.physAddr = dma_handle;
1453 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1455 error = mpt_config(ioc, &cfg);
1457 goto out_free_consistent;
1459 mptsas_print_phy_pg0(buffer);
1461 phy_info->hw_link_rate = buffer->HwLinkRate;
1462 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1463 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1464 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1466 out_free_consistent:
1467 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1468 buffer, dma_handle);
1474 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
1475 u32 form, u32 form_specific)
1477 ConfigExtendedPageHeader_t hdr;
1479 SasDevicePage0_t *buffer;
1480 dma_addr_t dma_handle;
1484 if (ioc->sas_discovery_runtime &&
1485 mptsas_is_end_device(device_info))
1488 hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
1489 hdr.ExtPageLength = 0;
1493 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1494 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
1496 cfg.cfghdr.ehdr = &hdr;
1497 cfg.pageAddr = form + form_specific;
1499 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1500 cfg.dir = 0; /* read */
1503 memset(device_info, 0, sizeof(struct mptsas_devinfo));
1504 error = mpt_config(ioc, &cfg);
1507 if (!hdr.ExtPageLength) {
1512 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1519 cfg.physAddr = dma_handle;
1520 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1522 error = mpt_config(ioc, &cfg);
1524 goto out_free_consistent;
1526 mptsas_print_device_pg0(buffer);
1528 device_info->handle = le16_to_cpu(buffer->DevHandle);
1529 device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
1530 device_info->handle_enclosure =
1531 le16_to_cpu(buffer->EnclosureHandle);
1532 device_info->slot = le16_to_cpu(buffer->Slot);
1533 device_info->phy_id = buffer->PhyNum;
1534 device_info->port_id = buffer->PhysicalPort;
1535 device_info->id = buffer->TargetID;
1536 device_info->phys_disk_num = ~0;
1537 device_info->channel = buffer->Bus;
1538 memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
1539 device_info->sas_address = le64_to_cpu(sas_address);
1540 device_info->device_info =
1541 le32_to_cpu(buffer->DeviceInfo);
1543 out_free_consistent:
1544 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1545 buffer, dma_handle);
1551 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
1552 u32 form, u32 form_specific)
1554 ConfigExtendedPageHeader_t hdr;
1556 SasExpanderPage0_t *buffer;
1557 dma_addr_t dma_handle;
1560 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1561 hdr.ExtPageLength = 0;
1565 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1566 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1568 cfg.cfghdr.ehdr = &hdr;
1570 cfg.pageAddr = form + form_specific;
1571 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1572 cfg.dir = 0; /* read */
1575 memset(port_info, 0, sizeof(struct mptsas_portinfo));
1576 error = mpt_config(ioc, &cfg);
1580 if (!hdr.ExtPageLength) {
1585 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1592 cfg.physAddr = dma_handle;
1593 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1595 error = mpt_config(ioc, &cfg);
1597 goto out_free_consistent;
1599 /* save config data */
1600 port_info->num_phys = buffer->NumPhys;
1601 port_info->phy_info = kcalloc(port_info->num_phys,
1602 sizeof(*port_info->phy_info),GFP_KERNEL);
1603 if (!port_info->phy_info) {
1605 goto out_free_consistent;
1608 for (i = 0; i < port_info->num_phys; i++) {
1609 port_info->phy_info[i].portinfo = port_info;
1610 port_info->phy_info[i].handle =
1611 le16_to_cpu(buffer->DevHandle);
1614 out_free_consistent:
1615 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1616 buffer, dma_handle);
1622 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1623 u32 form, u32 form_specific)
1625 ConfigExtendedPageHeader_t hdr;
1627 SasExpanderPage1_t *buffer;
1628 dma_addr_t dma_handle;
1631 if (ioc->sas_discovery_runtime &&
1632 mptsas_is_end_device(&phy_info->attached))
1635 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1636 hdr.ExtPageLength = 0;
1640 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1641 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1643 cfg.cfghdr.ehdr = &hdr;
1645 cfg.pageAddr = form + form_specific;
1646 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1647 cfg.dir = 0; /* read */
1650 error = mpt_config(ioc, &cfg);
1654 if (!hdr.ExtPageLength) {
1659 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1666 cfg.physAddr = dma_handle;
1667 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1669 error = mpt_config(ioc, &cfg);
1671 goto out_free_consistent;
1674 mptsas_print_expander_pg1(buffer);
1676 /* save config data */
1677 phy_info->phy_id = buffer->PhyIdentifier;
1678 phy_info->port_id = buffer->PhysicalPort;
1679 phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1680 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1681 phy_info->hw_link_rate = buffer->HwLinkRate;
1682 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1683 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1685 out_free_consistent:
1686 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1687 buffer, dma_handle);
1693 mptsas_parse_device_info(struct sas_identify *identify,
1694 struct mptsas_devinfo *device_info)
1698 identify->sas_address = device_info->sas_address;
1699 identify->phy_identifier = device_info->phy_id;
1702 * Fill in Phy Initiator Port Protocol.
1703 * Bits 6:3, more than one bit can be set, fall through cases.
1705 protocols = device_info->device_info & 0x78;
1706 identify->initiator_port_protocols = 0;
1707 if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1708 identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1709 if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1710 identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1711 if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1712 identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1713 if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1714 identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1717 * Fill in Phy Target Port Protocol.
1718 * Bits 10:7, more than one bit can be set, fall through cases.
1720 protocols = device_info->device_info & 0x780;
1721 identify->target_port_protocols = 0;
1722 if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1723 identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1724 if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1725 identify->target_port_protocols |= SAS_PROTOCOL_STP;
1726 if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1727 identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1728 if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1729 identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1732 * Fill in Attached device type.
1734 switch (device_info->device_info &
1735 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1736 case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1737 identify->device_type = SAS_PHY_UNUSED;
1739 case MPI_SAS_DEVICE_INFO_END_DEVICE:
1740 identify->device_type = SAS_END_DEVICE;
1742 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1743 identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1745 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1746 identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1751 static int mptsas_probe_one_phy(struct device *dev,
1752 struct mptsas_phyinfo *phy_info, int index, int local)
1755 struct sas_phy *phy;
1756 struct sas_port *port;
1764 if (!phy_info->phy) {
1765 phy = sas_phy_alloc(dev, index);
1771 phy = phy_info->phy;
1773 mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1776 * Set Negotiated link rate.
1778 switch (phy_info->negotiated_link_rate) {
1779 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1780 phy->negotiated_linkrate = SAS_PHY_DISABLED;
1782 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1783 phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1785 case MPI_SAS_IOUNIT0_RATE_1_5:
1786 phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1788 case MPI_SAS_IOUNIT0_RATE_3_0:
1789 phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1791 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1792 case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1794 phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1799 * Set Max hardware link rate.
1801 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1802 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1803 phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1805 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1806 phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1813 * Set Max programmed link rate.
1815 switch (phy_info->programmed_link_rate &
1816 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1817 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1818 phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1820 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1821 phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1828 * Set Min hardware link rate.
1830 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1831 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1832 phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1834 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1835 phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1842 * Set Min programmed link rate.
1844 switch (phy_info->programmed_link_rate &
1845 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1846 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1847 phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1849 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1850 phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1856 if (!phy_info->phy) {
1858 error = sas_phy_add(phy);
1863 phy_info->phy = phy;
1866 if (!phy_info->attached.handle ||
1867 !phy_info->port_details)
1870 port = mptsas_get_port(phy_info);
1871 ioc = phy_to_ioc(phy_info->phy);
1873 if (phy_info->sas_port_add_phy) {
1876 port = sas_port_alloc_num(dev);
1881 error = sas_port_add(port);
1883 dfailprintk((MYIOC_s_ERR_FMT
1884 "%s: exit at line=%d\n", ioc->name,
1885 __FUNCTION__, __LINE__));
1888 mptsas_set_port(phy_info, port);
1889 dsaswideprintk((KERN_DEBUG
1890 "sas_port_alloc: port=%p dev=%p port_id=%d\n",
1891 port, dev, port->port_identifier));
1893 dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
1895 sas_port_add_phy(port, phy_info->phy);
1896 phy_info->sas_port_add_phy = 0;
1899 if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
1901 struct sas_rphy *rphy;
1902 struct device *parent;
1903 struct sas_identify identify;
1905 parent = dev->parent->parent;
1907 * Let the hotplug_work thread handle processing
1908 * the adding/removing of devices that occur
1909 * after start of day.
1911 if (ioc->sas_discovery_runtime &&
1912 mptsas_is_end_device(&phy_info->attached))
1915 mptsas_parse_device_info(&identify, &phy_info->attached);
1916 if (scsi_is_host_device(parent)) {
1917 struct mptsas_portinfo *port_info;
1920 mutex_lock(&ioc->sas_topology_mutex);
1921 port_info = mptsas_find_portinfo_by_handle(ioc,
1923 mutex_unlock(&ioc->sas_topology_mutex);
1925 for (i = 0; i < port_info->num_phys; i++)
1926 if (port_info->phy_info[i].identify.sas_address ==
1927 identify.sas_address) {
1928 sas_port_mark_backlink(port);
1932 } else if (scsi_is_sas_rphy(parent)) {
1933 struct sas_rphy *parent_rphy = dev_to_rphy(parent);
1934 if (identify.sas_address ==
1935 parent_rphy->identify.sas_address) {
1936 sas_port_mark_backlink(port);
1941 switch (identify.device_type) {
1942 case SAS_END_DEVICE:
1943 rphy = sas_end_device_alloc(port);
1945 case SAS_EDGE_EXPANDER_DEVICE:
1946 case SAS_FANOUT_EXPANDER_DEVICE:
1947 rphy = sas_expander_alloc(port, identify.device_type);
1954 dfailprintk((MYIOC_s_ERR_FMT
1955 "%s: exit at line=%d\n", ioc->name,
1956 __FUNCTION__, __LINE__));
1960 rphy->identify = identify;
1961 error = sas_rphy_add(rphy);
1963 dfailprintk((MYIOC_s_ERR_FMT
1964 "%s: exit at line=%d\n", ioc->name,
1965 __FUNCTION__, __LINE__));
1966 sas_rphy_free(rphy);
1969 mptsas_set_rphy(phy_info, rphy);
1977 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
1979 struct mptsas_portinfo *port_info, *hba;
1980 int error = -ENOMEM, i;
1982 hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
1986 error = mptsas_sas_io_unit_pg0(ioc, hba);
1988 goto out_free_port_info;
1990 mutex_lock(&ioc->sas_topology_mutex);
1991 ioc->handle = hba->phy_info[0].handle;
1992 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
1995 list_add_tail(&port_info->list, &ioc->sas_topology);
1997 for (i = 0; i < hba->num_phys; i++) {
1998 port_info->phy_info[i].negotiated_link_rate =
1999 hba->phy_info[i].negotiated_link_rate;
2000 port_info->phy_info[i].handle =
2001 hba->phy_info[i].handle;
2002 port_info->phy_info[i].port_id =
2003 hba->phy_info[i].port_id;
2005 kfree(hba->phy_info);
2009 mutex_unlock(&ioc->sas_topology_mutex);
2010 for (i = 0; i < port_info->num_phys; i++) {
2011 mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
2012 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
2013 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
2015 mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
2016 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2017 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2018 port_info->phy_info[i].handle);
2019 port_info->phy_info[i].identify.phy_id =
2020 port_info->phy_info[i].phy_id = i;
2021 if (port_info->phy_info[i].attached.handle)
2022 mptsas_sas_device_pg0(ioc,
2023 &port_info->phy_info[i].attached,
2024 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2025 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2026 port_info->phy_info[i].attached.handle);
2029 mptsas_setup_wide_ports(ioc, port_info);
2031 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2032 mptsas_probe_one_phy(&ioc->sh->shost_gendev,
2033 &port_info->phy_info[i], ioc->sas_index, 1);
2044 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
2046 struct mptsas_portinfo *port_info, *p, *ex;
2047 struct device *parent;
2048 struct sas_rphy *rphy;
2049 int error = -ENOMEM, i, j;
2051 ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
2055 error = mptsas_sas_expander_pg0(ioc, ex,
2056 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
2057 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
2059 goto out_free_port_info;
2061 *handle = ex->phy_info[0].handle;
2063 mutex_lock(&ioc->sas_topology_mutex);
2064 port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
2067 list_add_tail(&port_info->list, &ioc->sas_topology);
2069 for (i = 0; i < ex->num_phys; i++) {
2070 port_info->phy_info[i].handle =
2071 ex->phy_info[i].handle;
2072 port_info->phy_info[i].port_id =
2073 ex->phy_info[i].port_id;
2075 kfree(ex->phy_info);
2079 mutex_unlock(&ioc->sas_topology_mutex);
2081 for (i = 0; i < port_info->num_phys; i++) {
2082 mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
2083 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
2084 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
2086 if (port_info->phy_info[i].identify.handle) {
2087 mptsas_sas_device_pg0(ioc,
2088 &port_info->phy_info[i].identify,
2089 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2090 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2091 port_info->phy_info[i].identify.handle);
2092 port_info->phy_info[i].identify.phy_id =
2093 port_info->phy_info[i].phy_id;
2096 if (port_info->phy_info[i].attached.handle) {
2097 mptsas_sas_device_pg0(ioc,
2098 &port_info->phy_info[i].attached,
2099 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2100 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2101 port_info->phy_info[i].attached.handle);
2102 port_info->phy_info[i].attached.phy_id =
2103 port_info->phy_info[i].phy_id;
2107 parent = &ioc->sh->shost_gendev;
2108 for (i = 0; i < port_info->num_phys; i++) {
2109 mutex_lock(&ioc->sas_topology_mutex);
2110 list_for_each_entry(p, &ioc->sas_topology, list) {
2111 for (j = 0; j < p->num_phys; j++) {
2112 if (port_info->phy_info[i].identify.handle !=
2113 p->phy_info[j].attached.handle)
2115 rphy = mptsas_get_rphy(&p->phy_info[j]);
2116 parent = &rphy->dev;
2119 mutex_unlock(&ioc->sas_topology_mutex);
2122 mptsas_setup_wide_ports(ioc, port_info);
2124 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2125 mptsas_probe_one_phy(parent, &port_info->phy_info[i],
2132 kfree(ex->phy_info);
2140 * mptsas_delete_expander_phys
2143 * This will traverse topology, and remove expanders
2144 * that are no longer present
2147 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
2149 struct mptsas_portinfo buffer;
2150 struct mptsas_portinfo *port_info, *n, *parent;
2151 struct mptsas_phyinfo *phy_info;
2152 struct sas_port * port;
2154 u64 expander_sas_address;
2156 mutex_lock(&ioc->sas_topology_mutex);
2157 list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
2159 if (port_info->phy_info &&
2160 (!(port_info->phy_info[0].identify.device_info &
2161 MPI_SAS_DEVICE_INFO_SMP_TARGET)))
2164 if (mptsas_sas_expander_pg0(ioc, &buffer,
2165 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
2166 MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
2167 port_info->phy_info[0].handle)) {
2170 * Obtain the port_info instance to the parent port
2172 parent = mptsas_find_portinfo_by_handle(ioc,
2173 port_info->phy_info[0].identify.handle_parent);
2178 expander_sas_address =
2179 port_info->phy_info[0].identify.sas_address;
2182 * Delete rphys in the parent that point
2183 * to this expander. The transport layer will
2184 * cleanup all the children.
2186 phy_info = parent->phy_info;
2187 for (i = 0; i < parent->num_phys; i++, phy_info++) {
2188 port = mptsas_get_port(phy_info);
2191 if (phy_info->attached.sas_address !=
2192 expander_sas_address)
2194 #ifdef MPT_DEBUG_SAS_WIDE
2195 dev_printk(KERN_DEBUG, &port->dev,
2196 "delete port (%d)\n", port->port_identifier);
2198 sas_port_delete(port);
2199 mptsas_port_delete(phy_info->port_details);
2203 phy_info = port_info->phy_info;
2204 for (i = 0; i < port_info->num_phys; i++, phy_info++)
2205 mptsas_port_delete(phy_info->port_details);
2207 list_del(&port_info->list);
2208 kfree(port_info->phy_info);
2212 * Free this memory allocated from inside
2213 * mptsas_sas_expander_pg0
2215 kfree(buffer.phy_info);
2217 mutex_unlock(&ioc->sas_topology_mutex);
2221 * Start of day discovery
2224 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
2226 u32 handle = 0xFFFF;
2229 mutex_lock(&ioc->sas_discovery_mutex);
2230 mptsas_probe_hba_phys(ioc);
2231 while (!mptsas_probe_expander_phys(ioc, &handle))
2234 Reporting RAID volumes.
2236 if (!ioc->ir_firmware)
2238 if (!ioc->raid_data.pIocPg2)
2240 if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
2242 for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
2243 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
2244 ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
2247 mutex_unlock(&ioc->sas_discovery_mutex);
2251 * Work queue thread to handle Runtime discovery
2252 * Mere purpose is the hot add/delete of expanders
2256 __mptsas_discovery_work(MPT_ADAPTER *ioc)
2258 u32 handle = 0xFFFF;
2260 ioc->sas_discovery_runtime=1;
2261 mptsas_delete_expander_phys(ioc);
2262 mptsas_probe_hba_phys(ioc);
2263 while (!mptsas_probe_expander_phys(ioc, &handle))
2265 ioc->sas_discovery_runtime=0;
2269 * Work queue thread to handle Runtime discovery
2270 * Mere purpose is the hot add/delete of expanders
2274 mptsas_discovery_work(struct work_struct *work)
2276 struct mptsas_discovery_event *ev =
2277 container_of(work, struct mptsas_discovery_event, work);
2278 MPT_ADAPTER *ioc = ev->ioc;
2280 mutex_lock(&ioc->sas_discovery_mutex);
2281 __mptsas_discovery_work(ioc);
2282 mutex_unlock(&ioc->sas_discovery_mutex);
2286 static struct mptsas_phyinfo *
2287 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
2289 struct mptsas_portinfo *port_info;
2290 struct mptsas_phyinfo *phy_info = NULL;
2293 mutex_lock(&ioc->sas_topology_mutex);
2294 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2295 for (i = 0; i < port_info->num_phys; i++) {
2296 if (!mptsas_is_end_device(
2297 &port_info->phy_info[i].attached))
2299 if (port_info->phy_info[i].attached.sas_address
2302 phy_info = &port_info->phy_info[i];
2306 mutex_unlock(&ioc->sas_topology_mutex);
2310 static struct mptsas_phyinfo *
2311 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
2313 struct mptsas_portinfo *port_info;
2314 struct mptsas_phyinfo *phy_info = NULL;
2317 mutex_lock(&ioc->sas_topology_mutex);
2318 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2319 for (i = 0; i < port_info->num_phys; i++) {
2320 if (!mptsas_is_end_device(
2321 &port_info->phy_info[i].attached))
2323 if (port_info->phy_info[i].attached.id != id)
2325 if (port_info->phy_info[i].attached.channel != channel)
2327 phy_info = &port_info->phy_info[i];
2331 mutex_unlock(&ioc->sas_topology_mutex);
2335 static struct mptsas_phyinfo *
2336 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
2338 struct mptsas_portinfo *port_info;
2339 struct mptsas_phyinfo *phy_info = NULL;
2342 mutex_lock(&ioc->sas_topology_mutex);
2343 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2344 for (i = 0; i < port_info->num_phys; i++) {
2345 if (!mptsas_is_end_device(
2346 &port_info->phy_info[i].attached))
2348 if (port_info->phy_info[i].attached.phys_disk_num == ~0)
2350 if (port_info->phy_info[i].attached.phys_disk_num != id)
2352 if (port_info->phy_info[i].attached.channel != channel)
2354 phy_info = &port_info->phy_info[i];
2358 mutex_unlock(&ioc->sas_topology_mutex);
2363 * Work queue thread to clear the persitency table
2366 mptsas_persist_clear_table(struct work_struct *work)
2368 MPT_ADAPTER *ioc = container_of(work, MPT_ADAPTER, sas_persist_task);
2370 mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
2374 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
2378 sdev->no_uld_attach = data ? 1 : 0;
2379 rc = scsi_device_reprobe(sdev);
2383 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
2385 starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
2386 mptsas_reprobe_lun);
2390 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
2393 ConfigPageHeader_t hdr;
2394 dma_addr_t dma_handle;
2395 pRaidVolumePage0_t buffer = NULL;
2396 RaidPhysDiskPage0_t phys_disk;
2398 struct mptsas_hotplug_event *ev;
2400 memset(&cfg, 0 , sizeof(CONFIGPARMS));
2401 memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
2402 hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
2403 cfg.pageAddr = (channel << 8) + id;
2404 cfg.cfghdr.hdr = &hdr;
2405 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2407 if (mpt_config(ioc, &cfg) != 0)
2410 if (!hdr.PageLength)
2413 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
2419 cfg.physAddr = dma_handle;
2420 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2422 if (mpt_config(ioc, &cfg) != 0)
2425 if (!(buffer->VolumeStatus.Flags &
2426 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
2429 if (!buffer->NumPhysDisks)
2432 for (i = 0; i < buffer->NumPhysDisks; i++) {
2434 if (mpt_raid_phys_disk_pg0(ioc,
2435 buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
2438 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2440 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2444 INIT_WORK(&ev->work, mptsas_hotplug_work);
2446 ev->id = phys_disk.PhysDiskID;
2447 ev->channel = phys_disk.PhysDiskBus;
2448 ev->phys_disk_num_valid = 1;
2449 ev->phys_disk_num = phys_disk.PhysDiskNum;
2450 ev->event_type = MPTSAS_ADD_DEVICE;
2451 schedule_work(&ev->work);
2456 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
2460 * Work queue thread to handle SAS hotplug events
2463 mptsas_hotplug_work(struct work_struct *work)
2465 struct mptsas_hotplug_event *ev =
2466 container_of(work, struct mptsas_hotplug_event, work);
2468 MPT_ADAPTER *ioc = ev->ioc;
2469 struct mptsas_phyinfo *phy_info;
2470 struct sas_rphy *rphy;
2471 struct sas_port *port;
2472 struct scsi_device *sdev;
2473 struct scsi_target * starget;
2474 struct sas_identify identify;
2476 struct mptsas_devinfo sas_device;
2477 VirtTarget *vtarget;
2478 VirtDevice *vdevice;
2480 mutex_lock(&ioc->sas_discovery_mutex);
2481 switch (ev->event_type) {
2482 case MPTSAS_DEL_DEVICE:
2485 if (ev->phys_disk_num_valid) {
2486 if (ev->hidden_raid_component){
2487 if (mptsas_sas_device_pg0(ioc, &sas_device,
2488 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2489 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2490 (ev->channel << 8) + ev->id)) {
2491 dfailprintk((MYIOC_s_ERR_FMT
2492 "%s: exit at line=%d\n", ioc->name,
2493 __FUNCTION__, __LINE__));
2496 phy_info = mptsas_find_phyinfo_by_sas_address(
2497 ioc, sas_device.sas_address);
2499 phy_info = mptsas_find_phyinfo_by_phys_disk_num(
2500 ioc, ev->channel, ev->phys_disk_num);
2504 phy_info = mptsas_find_phyinfo_by_target(ioc,
2505 ev->channel, ev->id);
2508 * Sanity checks, for non-existing phys and remote rphys.
2511 dfailprintk((MYIOC_s_ERR_FMT
2512 "%s: exit at line=%d\n", ioc->name,
2513 __FUNCTION__, __LINE__));
2516 if (!phy_info->port_details) {
2517 dfailprintk((MYIOC_s_ERR_FMT
2518 "%s: exit at line=%d\n", ioc->name,
2519 __FUNCTION__, __LINE__));
2522 rphy = mptsas_get_rphy(phy_info);
2524 dfailprintk((MYIOC_s_ERR_FMT
2525 "%s: exit at line=%d\n", ioc->name,
2526 __FUNCTION__, __LINE__));
2530 port = mptsas_get_port(phy_info);
2532 dfailprintk((MYIOC_s_ERR_FMT
2533 "%s: exit at line=%d\n", ioc->name,
2534 __FUNCTION__, __LINE__));
2538 starget = mptsas_get_starget(phy_info);
2540 vtarget = starget->hostdata;
2543 dfailprintk((MYIOC_s_ERR_FMT
2544 "%s: exit at line=%d\n", ioc->name,
2545 __FUNCTION__, __LINE__));
2550 * Handling RAID components
2552 if (ev->phys_disk_num_valid &&
2553 ev->hidden_raid_component) {
2554 printk(MYIOC_s_INFO_FMT
2555 "RAID Hidding: channel=%d, id=%d, "
2556 "physdsk %d \n", ioc->name, ev->channel,
2557 ev->id, ev->phys_disk_num);
2558 vtarget->id = ev->phys_disk_num;
2560 MPT_TARGET_FLAGS_RAID_COMPONENT;
2561 mptsas_reprobe_target(starget, 1);
2562 phy_info->attached.phys_disk_num =
2568 if (phy_info->attached.device_info &
2569 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2571 if (phy_info->attached.device_info &
2572 MPI_SAS_DEVICE_INFO_STP_TARGET)
2574 if (phy_info->attached.device_info &
2575 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2578 printk(MYIOC_s_INFO_FMT
2579 "removing %s device, channel %d, id %d, phy %d\n",
2580 ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
2581 #ifdef MPT_DEBUG_SAS_WIDE
2582 dev_printk(KERN_DEBUG, &port->dev,
2583 "delete port (%d)\n", port->port_identifier);
2585 sas_port_delete(port);
2586 mptsas_port_delete(phy_info->port_details);
2588 case MPTSAS_ADD_DEVICE:
2590 if (ev->phys_disk_num_valid)
2591 mpt_findImVolumes(ioc);
2594 * Refresh sas device pg0 data
2596 if (mptsas_sas_device_pg0(ioc, &sas_device,
2597 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2598 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2599 (ev->channel << 8) + ev->id)) {
2600 dfailprintk((MYIOC_s_ERR_FMT
2601 "%s: exit at line=%d\n", ioc->name,
2602 __FUNCTION__, __LINE__));
2606 __mptsas_discovery_work(ioc);
2608 phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
2609 sas_device.sas_address);
2611 if (!phy_info || !phy_info->port_details) {
2612 dfailprintk((MYIOC_s_ERR_FMT
2613 "%s: exit at line=%d\n", ioc->name,
2614 __FUNCTION__, __LINE__));
2618 starget = mptsas_get_starget(phy_info);
2619 if (starget && (!ev->hidden_raid_component)){
2621 vtarget = starget->hostdata;
2624 dfailprintk((MYIOC_s_ERR_FMT
2625 "%s: exit at line=%d\n", ioc->name,
2626 __FUNCTION__, __LINE__));
2630 * Handling RAID components
2632 if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2633 printk(MYIOC_s_INFO_FMT
2634 "RAID Exposing: channel=%d, id=%d, "
2635 "physdsk %d \n", ioc->name, ev->channel,
2636 ev->id, ev->phys_disk_num);
2638 ~MPT_TARGET_FLAGS_RAID_COMPONENT;
2639 vtarget->id = ev->id;
2640 mptsas_reprobe_target(starget, 0);
2641 phy_info->attached.phys_disk_num = ~0;
2646 if (mptsas_get_rphy(phy_info)) {
2647 dfailprintk((MYIOC_s_ERR_FMT
2648 "%s: exit at line=%d\n", ioc->name,
2649 __FUNCTION__, __LINE__));
2650 if (ev->channel) printk("%d\n", __LINE__);
2654 port = mptsas_get_port(phy_info);
2656 dfailprintk((MYIOC_s_ERR_FMT
2657 "%s: exit at line=%d\n", ioc->name,
2658 __FUNCTION__, __LINE__));
2661 memcpy(&phy_info->attached, &sas_device,
2662 sizeof(struct mptsas_devinfo));
2664 if (phy_info->attached.device_info &
2665 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2667 if (phy_info->attached.device_info &
2668 MPI_SAS_DEVICE_INFO_STP_TARGET)
2670 if (phy_info->attached.device_info &
2671 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2674 printk(MYIOC_s_INFO_FMT
2675 "attaching %s device, channel %d, id %d, phy %d\n",
2676 ioc->name, ds, ev->channel, ev->id, ev->phy_id);
2678 mptsas_parse_device_info(&identify, &phy_info->attached);
2679 rphy = sas_end_device_alloc(port);
2681 dfailprintk((MYIOC_s_ERR_FMT
2682 "%s: exit at line=%d\n", ioc->name,
2683 __FUNCTION__, __LINE__));
2684 break; /* non-fatal: an rphy can be added later */
2687 rphy->identify = identify;
2688 if (sas_rphy_add(rphy)) {
2689 dfailprintk((MYIOC_s_ERR_FMT
2690 "%s: exit at line=%d\n", ioc->name,
2691 __FUNCTION__, __LINE__));
2692 sas_rphy_free(rphy);
2695 mptsas_set_rphy(phy_info, rphy);
2697 case MPTSAS_ADD_RAID:
2698 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2701 scsi_device_put(sdev);
2704 printk(MYIOC_s_INFO_FMT
2705 "attaching raid volume, channel %d, id %d\n",
2706 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2707 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
2708 mpt_findImVolumes(ioc);
2710 case MPTSAS_DEL_RAID:
2711 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2715 printk(MYIOC_s_INFO_FMT
2716 "removing raid volume, channel %d, id %d\n",
2717 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2718 vdevice = sdev->hostdata;
2719 scsi_remove_device(sdev);
2720 scsi_device_put(sdev);
2721 mpt_findImVolumes(ioc);
2723 case MPTSAS_ADD_INACTIVE_VOLUME:
2724 mptsas_adding_inactive_raid_components(ioc,
2725 ev->channel, ev->id);
2727 case MPTSAS_IGNORE_EVENT:
2732 mutex_unlock(&ioc->sas_discovery_mutex);
2737 mptsas_send_sas_event(MPT_ADAPTER *ioc,
2738 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
2740 struct mptsas_hotplug_event *ev;
2741 u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
2745 (MPI_SAS_DEVICE_INFO_SSP_TARGET |
2746 MPI_SAS_DEVICE_INFO_STP_TARGET |
2747 MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
2750 switch (sas_event_data->ReasonCode) {
2751 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
2753 mptsas_target_reset_queue(ioc, sas_event_data);
2756 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
2757 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2759 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2763 INIT_WORK(&ev->work, mptsas_hotplug_work);
2765 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
2767 le16_to_cpu(sas_event_data->ParentDevHandle);
2768 ev->channel = sas_event_data->Bus;
2769 ev->id = sas_event_data->TargetID;
2770 ev->phy_id = sas_event_data->PhyNum;
2771 memcpy(&sas_address, &sas_event_data->SASAddress,
2773 ev->sas_address = le64_to_cpu(sas_address);
2774 ev->device_info = device_info;
2776 if (sas_event_data->ReasonCode &
2777 MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
2778 ev->event_type = MPTSAS_ADD_DEVICE;
2780 ev->event_type = MPTSAS_DEL_DEVICE;
2781 schedule_work(&ev->work);
2783 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
2785 * Persistent table is full.
2787 INIT_WORK(&ioc->sas_persist_task,
2788 mptsas_persist_clear_table);
2789 schedule_work(&ioc->sas_persist_task);
2792 * TODO, handle other events
2794 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
2795 case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
2796 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
2797 case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
2798 case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
2799 case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
2800 case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
2806 mptsas_send_raid_event(MPT_ADAPTER *ioc,
2807 EVENT_DATA_RAID *raid_event_data)
2809 struct mptsas_hotplug_event *ev;
2810 int status = le32_to_cpu(raid_event_data->SettingsStatus);
2811 int state = (status >> 8) & 0xff;
2813 if (ioc->bus_type != SAS)
2816 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2818 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2822 INIT_WORK(&ev->work, mptsas_hotplug_work);
2824 ev->id = raid_event_data->VolumeID;
2825 ev->channel = raid_event_data->VolumeBus;
2826 ev->event_type = MPTSAS_IGNORE_EVENT;
2828 switch (raid_event_data->ReasonCode) {
2829 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
2830 ev->phys_disk_num_valid = 1;
2831 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2832 ev->event_type = MPTSAS_ADD_DEVICE;
2834 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
2835 ev->phys_disk_num_valid = 1;
2836 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2837 ev->hidden_raid_component = 1;
2838 ev->event_type = MPTSAS_DEL_DEVICE;
2840 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
2842 case MPI_PD_STATE_ONLINE:
2843 case MPI_PD_STATE_NOT_COMPATIBLE:
2844 ev->phys_disk_num_valid = 1;
2845 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2846 ev->hidden_raid_component = 1;
2847 ev->event_type = MPTSAS_ADD_DEVICE;
2849 case MPI_PD_STATE_MISSING:
2850 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
2851 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
2852 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
2853 ev->phys_disk_num_valid = 1;
2854 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2855 ev->event_type = MPTSAS_DEL_DEVICE;
2861 case MPI_EVENT_RAID_RC_VOLUME_DELETED:
2862 ev->event_type = MPTSAS_DEL_RAID;
2864 case MPI_EVENT_RAID_RC_VOLUME_CREATED:
2865 ev->event_type = MPTSAS_ADD_RAID;
2867 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
2869 case MPI_RAIDVOL0_STATUS_STATE_FAILED:
2870 case MPI_RAIDVOL0_STATUS_STATE_MISSING:
2871 ev->event_type = MPTSAS_DEL_RAID;
2873 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
2874 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
2875 ev->event_type = MPTSAS_ADD_RAID;
2884 schedule_work(&ev->work);
2888 mptsas_send_discovery_event(MPT_ADAPTER *ioc,
2889 EVENT_DATA_SAS_DISCOVERY *discovery_data)
2891 struct mptsas_discovery_event *ev;
2896 * This flag will be non-zero when firmware
2897 * kicks off discovery, and return to zero
2898 * once its completed.
2900 if (discovery_data->DiscoveryStatus)
2903 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2906 INIT_WORK(&ev->work, mptsas_discovery_work);
2908 schedule_work(&ev->work);
2912 * mptsas_send_ir2_event - handle exposing hidden disk when
2913 * an inactive raid volume is added
2915 * @ioc: Pointer to MPT_ADAPTER structure
2920 mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
2922 struct mptsas_hotplug_event *ev;
2924 if (ir2_data->ReasonCode !=
2925 MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
2928 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2932 INIT_WORK(&ev->work, mptsas_hotplug_work);
2934 ev->id = ir2_data->TargetID;
2935 ev->channel = ir2_data->Bus;
2936 ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
2938 schedule_work(&ev->work);
2942 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
2945 u8 event = le32_to_cpu(reply->Event) & 0xFF;
2951 * sas_discovery_ignore_events
2953 * This flag is to prevent anymore processing of
2954 * sas events once mptsas_remove function is called.
2956 if (ioc->sas_discovery_ignore_events) {
2957 rc = mptscsih_event_process(ioc, reply);
2962 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
2963 mptsas_send_sas_event(ioc,
2964 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
2966 case MPI_EVENT_INTEGRATED_RAID:
2967 mptsas_send_raid_event(ioc,
2968 (EVENT_DATA_RAID *)reply->Data);
2970 case MPI_EVENT_PERSISTENT_TABLE_FULL:
2971 INIT_WORK(&ioc->sas_persist_task,
2972 mptsas_persist_clear_table);
2973 schedule_work(&ioc->sas_persist_task);
2975 case MPI_EVENT_SAS_DISCOVERY:
2976 mptsas_send_discovery_event(ioc,
2977 (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
2980 mptsas_send_ir2_event(ioc,
2981 (PTR_MPI_EVENT_DATA_IR2)reply->Data);
2984 rc = mptscsih_event_process(ioc, reply);
2993 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2995 struct Scsi_Host *sh;
2998 unsigned long flags;
3006 r = mpt_attach(pdev,id);
3010 ioc = pci_get_drvdata(pdev);
3011 ioc->DoneCtx = mptsasDoneCtx;
3012 ioc->TaskCtx = mptsasTaskCtx;
3013 ioc->InternalCtx = mptsasInternalCtx;
3015 /* Added sanity check on readiness of the MPT adapter.
3017 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
3018 printk(MYIOC_s_WARN_FMT
3019 "Skipping because it's not operational!\n",
3022 goto out_mptsas_probe;
3026 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
3029 goto out_mptsas_probe;
3032 /* Sanity check - ensure at least 1 port is INITIATOR capable
3035 for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
3036 if (ioc->pfacts[ii].ProtocolFlags &
3037 MPI_PORTFACTS_PROTOCOL_INITIATOR)
3042 printk(MYIOC_s_WARN_FMT
3043 "Skipping ioc=%p because SCSI Initiator mode "
3044 "is NOT enabled!\n", ioc->name, ioc);
3048 sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
3050 printk(MYIOC_s_WARN_FMT
3051 "Unable to register controller with SCSI subsystem\n",
3054 goto out_mptsas_probe;
3057 spin_lock_irqsave(&ioc->FreeQlock, flags);
3059 /* Attach the SCSI Host to the IOC structure
3067 /* set 16 byte cdb's */
3068 sh->max_cmd_len = 16;
3070 sh->max_id = ioc->pfacts[0].PortSCSIID;
3071 sh->max_lun = max_lun;
3073 sh->transportt = mptsas_transport_template;
3075 sh->this_id = ioc->pfacts[0].PortSCSIID;
3079 sh->unique_id = ioc->id;
3081 INIT_LIST_HEAD(&ioc->sas_topology);
3082 mutex_init(&ioc->sas_topology_mutex);
3083 mutex_init(&ioc->sas_discovery_mutex);
3084 mutex_init(&ioc->sas_mgmt.mutex);
3085 init_completion(&ioc->sas_mgmt.done);
3087 /* Verify that we won't exceed the maximum
3088 * number of chain buffers
3089 * We can optimize: ZZ = req_sz/sizeof(SGE)
3091 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
3092 * + (req_sz - 64)/sizeof(SGE)
3093 * A slightly different algorithm is required for
3096 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
3097 if (sizeof(dma_addr_t) == sizeof(u64)) {
3098 numSGE = (scale - 1) *
3099 (ioc->facts.MaxChainDepth-1) + scale +
3100 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
3103 numSGE = 1 + (scale - 1) *
3104 (ioc->facts.MaxChainDepth-1) + scale +
3105 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
3109 if (numSGE < sh->sg_tablesize) {
3110 /* Reset this value */
3111 dprintk((MYIOC_s_INFO_FMT
3112 "Resetting sg_tablesize to %d from %d\n",
3113 ioc->name, numSGE, sh->sg_tablesize));
3114 sh->sg_tablesize = numSGE;
3117 hd = (MPT_SCSI_HOST *) sh->hostdata;
3120 /* SCSI needs scsi_cmnd lookup table!
3121 * (with size equal to req_depth*PtrSz!)
3123 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
3124 if (!hd->ScsiLookup) {
3126 goto out_mptsas_probe;
3129 dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
3130 ioc->name, hd->ScsiLookup));
3132 /* Clear the TM flags
3135 hd->tmState = TM_STATE_NONE;
3136 hd->resetPending = 0;
3137 hd->abortSCpnt = NULL;
3139 /* Clear the pointer used to store
3140 * single-threaded commands, i.e., those
3141 * issued during a bus scan, dv and
3142 * configuration pages.
3146 /* Initialize this SCSI Hosts' timers
3147 * To use, set the timer expires field
3150 init_timer(&hd->timer);
3151 hd->timer.data = (unsigned long) hd;
3152 hd->timer.function = mptscsih_timer_expired;
3154 ioc->sas_data.ptClear = mpt_pt_clear;
3156 init_waitqueue_head(&hd->scandv_waitq);
3157 hd->scandv_wait_done = 0;
3158 hd->last_queue_full = 0;
3159 INIT_LIST_HEAD(&hd->target_reset_list);
3160 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3162 if (ioc->sas_data.ptClear==1) {
3163 mptbase_sas_persist_operation(
3164 ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
3167 error = scsi_add_host(sh, &ioc->pcidev->dev);
3169 dprintk((KERN_ERR MYNAM
3170 "scsi_add_host failed\n"));
3171 goto out_mptsas_probe;
3174 mptsas_scan_sas_topology(ioc);
3180 mptscsih_remove(pdev);
3184 static void __devexit mptsas_remove(struct pci_dev *pdev)
3186 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
3187 struct mptsas_portinfo *p, *n;
3190 ioc->sas_discovery_ignore_events = 1;
3191 sas_remove_host(ioc->sh);
3193 mutex_lock(&ioc->sas_topology_mutex);
3194 list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
3196 for (i = 0 ; i < p->num_phys ; i++)
3197 mptsas_port_delete(p->phy_info[i].port_details);
3201 mutex_unlock(&ioc->sas_topology_mutex);
3203 mptscsih_remove(pdev);
3206 static struct pci_device_id mptsas_pci_table[] = {
3207 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
3208 PCI_ANY_ID, PCI_ANY_ID },
3209 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
3210 PCI_ANY_ID, PCI_ANY_ID },
3211 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
3212 PCI_ANY_ID, PCI_ANY_ID },
3213 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
3214 PCI_ANY_ID, PCI_ANY_ID },
3215 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
3216 PCI_ANY_ID, PCI_ANY_ID },
3217 {0} /* Terminating entry */
3219 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
3222 static struct pci_driver mptsas_driver = {
3224 .id_table = mptsas_pci_table,
3225 .probe = mptsas_probe,
3226 .remove = __devexit_p(mptsas_remove),
3227 .shutdown = mptscsih_shutdown,
3229 .suspend = mptscsih_suspend,
3230 .resume = mptscsih_resume,
3237 show_mptmod_ver(my_NAME, my_VERSION);
3239 mptsas_transport_template =
3240 sas_attach_transport(&mptsas_transport_functions);
3241 if (!mptsas_transport_template)
3244 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
3245 mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
3247 mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
3248 mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
3250 if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) {
3251 devtverboseprintk((KERN_INFO MYNAM
3252 ": Registered for IOC event notifications\n"));
3255 if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
3256 dprintk((KERN_INFO MYNAM
3257 ": Registered for IOC reset notifications\n"));
3260 return pci_register_driver(&mptsas_driver);
3266 pci_unregister_driver(&mptsas_driver);
3267 sas_release_transport(mptsas_transport_template);
3269 mpt_reset_deregister(mptsasDoneCtx);
3270 mpt_event_deregister(mptsasDoneCtx);
3272 mpt_deregister(mptsasMgmtCtx);
3273 mpt_deregister(mptsasInternalCtx);
3274 mpt_deregister(mptsasTaskCtx);
3275 mpt_deregister(mptsasDoneCtx);
3278 module_init(mptsas_init);
3279 module_exit(mptsas_exit);