2 * linux/drivers/message/fusion/mptsas.c
3 * For use with LSI PCI chip/adapter(s)
4 * running LSI Fusion MPT (Message Passing Technology) firmware.
6 * Copyright (c) 1999-2007 LSI Corporation
7 * (mailto:DL-MPTFusionLinux@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>
67 #define my_NAME "Fusion MPT SAS Host driver"
68 #define my_VERSION MPT_LINUX_VERSION_COMMON
69 #define MYNAM "mptsas"
72 * Reserved channel for integrated raid
74 #define MPTSAS_RAID_CHANNEL 1
76 MODULE_AUTHOR(MODULEAUTHOR);
77 MODULE_DESCRIPTION(my_NAME);
78 MODULE_LICENSE("GPL");
79 MODULE_VERSION(my_VERSION);
81 static int mpt_pt_clear;
82 module_param(mpt_pt_clear, int, 0);
83 MODULE_PARM_DESC(mpt_pt_clear,
84 " Clear persistency table: enable=1 "
85 "(default=MPTSCSIH_PT_CLEAR=0)");
87 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
88 #define MPTSAS_MAX_LUN (16895)
89 static int max_lun = MPTSAS_MAX_LUN;
90 module_param(max_lun, int, 0);
91 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
93 static u8 mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
94 static u8 mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
95 static u8 mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
96 static u8 mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;
98 static void mptsas_hotplug_work(struct work_struct *work);
100 static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
101 MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
103 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
104 "---- IO UNIT PAGE 0 ------------\n", ioc->name));
105 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
106 ioc->name, le16_to_cpu(phy_data->AttachedDeviceHandle)));
107 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Controller Handle=0x%X\n",
108 ioc->name, le16_to_cpu(phy_data->ControllerDevHandle)));
109 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port=0x%X\n",
110 ioc->name, phy_data->Port));
111 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port Flags=0x%X\n",
112 ioc->name, phy_data->PortFlags));
113 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Flags=0x%X\n",
114 ioc->name, phy_data->PhyFlags));
115 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
116 ioc->name, phy_data->NegotiatedLinkRate));
117 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
118 "Controller PHY Device Info=0x%X\n", ioc->name,
119 le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
120 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DiscoveryStatus=0x%X\n\n",
121 ioc->name, le32_to_cpu(phy_data->DiscoveryStatus)));
124 static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
128 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
130 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
131 "---- SAS PHY PAGE 0 ------------\n", ioc->name));
132 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
133 "Attached Device Handle=0x%X\n", ioc->name,
134 le16_to_cpu(pg0->AttachedDevHandle)));
135 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
136 ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
137 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
138 "Attached PHY Identifier=0x%X\n", ioc->name,
139 pg0->AttachedPhyIdentifier));
140 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Attached Device Info=0x%X\n",
141 ioc->name, le32_to_cpu(pg0->AttachedDeviceInfo)));
142 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
143 ioc->name, pg0->ProgrammedLinkRate));
144 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Change Count=0x%X\n",
145 ioc->name, pg0->ChangeCount));
146 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Info=0x%X\n\n",
147 ioc->name, le32_to_cpu(pg0->PhyInfo)));
150 static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
152 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
153 "---- SAS PHY PAGE 1 ------------\n", ioc->name));
154 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Invalid Dword Count=0x%x\n",
155 ioc->name, pg1->InvalidDwordCount));
156 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
157 "Running Disparity Error Count=0x%x\n", ioc->name,
158 pg1->RunningDisparityErrorCount));
159 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
160 "Loss Dword Synch Count=0x%x\n", ioc->name,
161 pg1->LossDwordSynchCount));
162 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
163 "PHY Reset Problem Count=0x%x\n\n", ioc->name,
164 pg1->PhyResetProblemCount));
167 static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
171 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
173 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
174 "---- SAS DEVICE PAGE 0 ---------\n", ioc->name));
175 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
176 ioc->name, le16_to_cpu(pg0->DevHandle)));
177 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Handle=0x%X\n",
178 ioc->name, le16_to_cpu(pg0->ParentDevHandle)));
179 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Enclosure Handle=0x%X\n",
180 ioc->name, le16_to_cpu(pg0->EnclosureHandle)));
181 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Slot=0x%X\n",
182 ioc->name, le16_to_cpu(pg0->Slot)));
183 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
184 ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
185 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Target ID=0x%X\n",
186 ioc->name, pg0->TargetID));
187 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Bus=0x%X\n",
188 ioc->name, pg0->Bus));
189 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Phy Num=0x%X\n",
190 ioc->name, pg0->PhyNum));
191 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Access Status=0x%X\n",
192 ioc->name, le16_to_cpu(pg0->AccessStatus)));
193 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Device Info=0x%X\n",
194 ioc->name, le32_to_cpu(pg0->DeviceInfo)));
195 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Flags=0x%X\n",
196 ioc->name, le16_to_cpu(pg0->Flags)));
197 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n\n",
198 ioc->name, pg0->PhysicalPort));
201 static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
203 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
204 "---- SAS EXPANDER PAGE 1 ------------\n", ioc->name));
205 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n",
206 ioc->name, pg1->PhysicalPort));
207 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Identifier=0x%X\n",
208 ioc->name, pg1->PhyIdentifier));
209 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
210 ioc->name, pg1->NegotiatedLinkRate));
211 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
212 ioc->name, pg1->ProgrammedLinkRate));
213 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hardware Link Rate=0x%X\n",
214 ioc->name, pg1->HwLinkRate));
215 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Owner Device Handle=0x%X\n",
216 ioc->name, le16_to_cpu(pg1->OwnerDevHandle)));
217 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
218 "Attached Device Handle=0x%X\n\n", ioc->name,
219 le16_to_cpu(pg1->AttachedDevHandle)));
222 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
224 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
225 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
228 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
230 struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
231 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
235 * mptsas_find_portinfo_by_handle
237 * This function should be called with the sas_topology_mutex already held
239 static struct mptsas_portinfo *
240 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
242 struct mptsas_portinfo *port_info, *rc=NULL;
245 list_for_each_entry(port_info, &ioc->sas_topology, list)
246 for (i = 0; i < port_info->num_phys; i++)
247 if (port_info->phy_info[i].identify.handle == handle) {
256 * Returns true if there is a scsi end device
259 mptsas_is_end_device(struct mptsas_devinfo * attached)
261 if ((attached->sas_address) &&
262 (attached->device_info &
263 MPI_SAS_DEVICE_INFO_END_DEVICE) &&
264 ((attached->device_info &
265 MPI_SAS_DEVICE_INFO_SSP_TARGET) |
266 (attached->device_info &
267 MPI_SAS_DEVICE_INFO_STP_TARGET) |
268 (attached->device_info &
269 MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
277 mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details)
279 struct mptsas_portinfo *port_info;
280 struct mptsas_phyinfo *phy_info;
286 port_info = port_details->port_info;
287 phy_info = port_info->phy_info;
289 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d "
290 "bitmask=0x%016llX\n", ioc->name, __FUNCTION__, port_details,
291 port_details->num_phys, (unsigned long long)
292 port_details->phy_bitmask));
294 for (i = 0; i < port_info->num_phys; i++, phy_info++) {
295 if(phy_info->port_details != port_details)
297 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
298 phy_info->port_details = NULL;
303 static inline struct sas_rphy *
304 mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
306 if (phy_info->port_details)
307 return phy_info->port_details->rphy;
313 mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
315 if (phy_info->port_details) {
316 phy_info->port_details->rphy = rphy;
317 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n",
322 dsaswideprintk(ioc, dev_printk(MYIOC_s_DEBUG_FMT,
323 &rphy->dev, "add:", ioc->name));
324 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n",
325 ioc->name, rphy, rphy->dev.release));
329 static inline struct sas_port *
330 mptsas_get_port(struct mptsas_phyinfo *phy_info)
332 if (phy_info->port_details)
333 return phy_info->port_details->port;
339 mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_port *port)
341 if (phy_info->port_details)
342 phy_info->port_details->port = port;
345 dsaswideprintk(ioc, dev_printk(MYIOC_s_DEBUG_FMT,
346 &port->dev, "add:", ioc->name));
347 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "port=%p release=%p\n",
348 ioc->name, port, port->dev.release));
352 static inline struct scsi_target *
353 mptsas_get_starget(struct mptsas_phyinfo *phy_info)
355 if (phy_info->port_details)
356 return phy_info->port_details->starget;
362 mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target *
365 if (phy_info->port_details)
366 phy_info->port_details->starget = starget;
371 * mptsas_setup_wide_ports
373 * Updates for new and existing narrow/wide port configuration
374 * in the sas_topology
377 mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
379 struct mptsas_portinfo_details * port_details;
380 struct mptsas_phyinfo *phy_info, *phy_info_cmp;
384 mutex_lock(&ioc->sas_topology_mutex);
386 phy_info = port_info->phy_info;
387 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
388 if (phy_info->attached.handle)
390 port_details = phy_info->port_details;
393 if (port_details->num_phys < 2)
396 * Removing a phy from a port, letting the last
397 * phy be removed by firmware events.
399 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
400 "%s: [%p]: deleting phy = %d\n",
401 ioc->name, __FUNCTION__, port_details, i));
402 port_details->num_phys--;
403 port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
404 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
405 sas_port_delete_phy(port_details->port, phy_info->phy);
406 phy_info->port_details = NULL;
410 * Populate and refresh the tree
412 phy_info = port_info->phy_info;
413 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
414 sas_address = phy_info->attached.sas_address;
415 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n",
416 ioc->name, i, (unsigned long long)sas_address));
419 port_details = phy_info->port_details;
424 port_details = kzalloc(sizeof(*port_details),
428 port_details->num_phys = 1;
429 port_details->port_info = port_info;
430 if (phy_info->phy_id < 64 )
431 port_details->phy_bitmask |=
432 (1 << phy_info->phy_id);
433 phy_info->sas_port_add_phy=1;
434 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t"
435 "phy_id=%d sas_address=0x%018llX\n",
436 ioc->name, i, (unsigned long long)sas_address));
437 phy_info->port_details = port_details;
440 if (i == port_info->num_phys - 1)
442 phy_info_cmp = &port_info->phy_info[i + 1];
443 for (j = i + 1 ; j < port_info->num_phys ; j++,
445 if (!phy_info_cmp->attached.sas_address)
447 if (sas_address != phy_info_cmp->attached.sas_address)
449 if (phy_info_cmp->port_details == port_details )
451 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
452 "\t\tphy_id=%d sas_address=0x%018llX\n",
453 ioc->name, j, (unsigned long long)
454 phy_info_cmp->attached.sas_address));
455 if (phy_info_cmp->port_details) {
457 mptsas_get_rphy(phy_info_cmp);
459 mptsas_get_port(phy_info_cmp);
460 port_details->starget =
461 mptsas_get_starget(phy_info_cmp);
462 port_details->num_phys =
463 phy_info_cmp->port_details->num_phys;
464 if (!phy_info_cmp->port_details->num_phys)
465 kfree(phy_info_cmp->port_details);
467 phy_info_cmp->sas_port_add_phy=1;
469 * Adding a phy to a port
471 phy_info_cmp->port_details = port_details;
472 if (phy_info_cmp->phy_id < 64 )
473 port_details->phy_bitmask |=
474 (1 << phy_info_cmp->phy_id);
475 port_details->num_phys++;
481 for (i = 0; i < port_info->num_phys; i++) {
482 port_details = port_info->phy_info[i].port_details;
485 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
486 "%s: [%p]: phy_id=%02d num_phys=%02d "
487 "bitmask=0x%016llX\n", ioc->name, __FUNCTION__,
488 port_details, i, port_details->num_phys,
489 (unsigned long long)port_details->phy_bitmask));
490 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n",
491 ioc->name, port_details->port, port_details->rphy));
493 dsaswideprintk(ioc, printk("\n"));
494 mutex_unlock(&ioc->sas_topology_mutex);
498 * csmisas_find_vtarget
506 mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
508 struct scsi_device *sdev;
510 VirtTarget *vtarget = NULL;
512 shost_for_each_device(sdev, ioc->sh) {
513 if ((vdevice = sdev->hostdata) == NULL)
515 if (vdevice->vtarget->id == id &&
516 vdevice->vtarget->channel == channel)
517 vtarget = vdevice->vtarget;
523 * mptsas_target_reset
525 * Issues TARGET_RESET to end device using handshaking method
531 * Returns (1) success
536 mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
539 SCSITaskMgmt_t *pScsiTm;
541 if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
542 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
543 ioc->name,__FUNCTION__, __LINE__));
547 /* Format the Request
549 pScsiTm = (SCSITaskMgmt_t *) mf;
550 memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
551 pScsiTm->TargetID = id;
552 pScsiTm->Bus = channel;
553 pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
554 pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
555 pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
557 DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
559 mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf);
565 * mptsas_target_reset_queue
567 * Receive request for TARGET_RESET after recieving an firmware
568 * event NOT_RESPONDING_EVENT, then put command in link list
569 * and queue if task_queue already in use.
576 mptsas_target_reset_queue(MPT_ADAPTER *ioc,
577 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
579 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
580 VirtTarget *vtarget = NULL;
581 struct mptsas_target_reset_event *target_reset_list;
584 id = sas_event_data->TargetID;
585 channel = sas_event_data->Bus;
587 if (!(vtarget = mptsas_find_vtarget(ioc, channel, id)))
590 vtarget->deleted = 1; /* block IO */
592 target_reset_list = kzalloc(sizeof(*target_reset_list),
594 if (!target_reset_list) {
595 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
596 ioc->name,__FUNCTION__, __LINE__));
600 memcpy(&target_reset_list->sas_event_data, sas_event_data,
601 sizeof(*sas_event_data));
602 list_add_tail(&target_reset_list->list, &hd->target_reset_list);
604 if (hd->resetPending)
607 if (mptsas_target_reset(ioc, channel, id)) {
608 target_reset_list->target_reset_issued = 1;
609 hd->resetPending = 1;
614 * mptsas_dev_reset_complete
616 * Completion for TARGET_RESET after NOT_RESPONDING_EVENT,
617 * enable work queue to finish off removing device from upper layers.
618 * then send next TARGET_RESET in the queue.
624 mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
626 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
627 struct list_head *head = &hd->target_reset_list;
628 struct mptsas_target_reset_event *target_reset_list;
629 struct mptsas_hotplug_event *ev;
630 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
634 if (list_empty(head))
637 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, list);
639 sas_event_data = &target_reset_list->sas_event_data;
640 id = sas_event_data->TargetID;
641 channel = sas_event_data->Bus;
642 hd->resetPending = 0;
647 if (!target_reset_list->target_reset_issued) {
648 if (mptsas_target_reset(ioc, channel, id)) {
649 target_reset_list->target_reset_issued = 1;
650 hd->resetPending = 1;
656 * enable work queue to remove device from upper layers
658 list_del(&target_reset_list->list);
660 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
662 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
663 ioc->name,__FUNCTION__, __LINE__));
667 INIT_WORK(&ev->work, mptsas_hotplug_work);
669 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
671 le16_to_cpu(sas_event_data->ParentDevHandle);
672 ev->channel = channel;
674 ev->phy_id = sas_event_data->PhyNum;
675 memcpy(&sas_address, &sas_event_data->SASAddress,
677 ev->sas_address = le64_to_cpu(sas_address);
678 ev->device_info = le32_to_cpu(sas_event_data->DeviceInfo);
679 ev->event_type = MPTSAS_DEL_DEVICE;
680 schedule_work(&ev->work);
681 kfree(target_reset_list);
684 * issue target reset to next device in the queue
687 head = &hd->target_reset_list;
688 if (list_empty(head))
691 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event,
694 sas_event_data = &target_reset_list->sas_event_data;
695 id = sas_event_data->TargetID;
696 channel = sas_event_data->Bus;
698 if (mptsas_target_reset(ioc, channel, id)) {
699 target_reset_list->target_reset_issued = 1;
700 hd->resetPending = 1;
705 * mptsas_taskmgmt_complete
713 mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
715 mptsas_dev_reset_complete(ioc);
716 return mptscsih_taskmgmt_complete(ioc, mf, mr);
727 mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
730 struct mptsas_target_reset_event *target_reset_list, *n;
733 rc = mptscsih_ioc_reset(ioc, reset_phase);
735 if (ioc->bus_type != SAS)
738 if (reset_phase != MPT_IOC_POST_RESET)
741 if (!ioc->sh || !ioc->sh->hostdata)
743 hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
747 if (list_empty(&hd->target_reset_list))
750 /* flush the target_reset_list */
751 list_for_each_entry_safe(target_reset_list, n,
752 &hd->target_reset_list, list) {
753 list_del(&target_reset_list->list);
754 kfree(target_reset_list);
762 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
763 u32 form, u32 form_specific)
765 ConfigExtendedPageHeader_t hdr;
767 SasEnclosurePage0_t *buffer;
768 dma_addr_t dma_handle;
770 __le64 le_identifier;
772 memset(&hdr, 0, sizeof(hdr));
773 hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
775 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
776 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
778 cfg.cfghdr.ehdr = &hdr;
780 cfg.pageAddr = form + form_specific;
781 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
782 cfg.dir = 0; /* read */
785 error = mpt_config(ioc, &cfg);
788 if (!hdr.ExtPageLength) {
793 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
800 cfg.physAddr = dma_handle;
801 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
803 error = mpt_config(ioc, &cfg);
805 goto out_free_consistent;
807 /* save config data */
808 memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
809 enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
810 enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
811 enclosure->flags = le16_to_cpu(buffer->Flags);
812 enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
813 enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
814 enclosure->start_id = buffer->StartTargetID;
815 enclosure->start_channel = buffer->StartBus;
816 enclosure->sep_id = buffer->SEPTargetID;
817 enclosure->sep_channel = buffer->SEPBus;
820 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
827 mptsas_slave_configure(struct scsi_device *sdev)
830 if (sdev->channel == MPTSAS_RAID_CHANNEL)
833 sas_read_port_mode_page(sdev);
836 return mptscsih_slave_configure(sdev);
840 mptsas_target_alloc(struct scsi_target *starget)
842 struct Scsi_Host *host = dev_to_shost(&starget->dev);
843 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
846 struct sas_rphy *rphy;
847 struct mptsas_portinfo *p;
849 MPT_ADAPTER *ioc = hd->ioc;
851 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
855 vtarget->starget = starget;
856 vtarget->ioc_id = ioc->id;
857 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
862 * RAID volumes placed beyond the last expected port.
864 if (starget->channel == MPTSAS_RAID_CHANNEL) {
865 for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
866 if (id == ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
867 channel = ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
871 rphy = dev_to_rphy(starget->dev.parent);
872 mutex_lock(&ioc->sas_topology_mutex);
873 list_for_each_entry(p, &ioc->sas_topology, list) {
874 for (i = 0; i < p->num_phys; i++) {
875 if (p->phy_info[i].attached.sas_address !=
876 rphy->identify.sas_address)
878 id = p->phy_info[i].attached.id;
879 channel = p->phy_info[i].attached.channel;
880 mptsas_set_starget(&p->phy_info[i], starget);
883 * Exposing hidden raid components
885 if (mptscsih_is_phys_disk(ioc, channel, id)) {
886 id = mptscsih_raid_id_to_num(ioc,
889 MPT_TARGET_FLAGS_RAID_COMPONENT;
890 p->phy_info[i].attached.phys_disk_num = id;
892 mutex_unlock(&ioc->sas_topology_mutex);
896 mutex_unlock(&ioc->sas_topology_mutex);
903 vtarget->channel = channel;
904 starget->hostdata = vtarget;
909 mptsas_target_destroy(struct scsi_target *starget)
911 struct Scsi_Host *host = dev_to_shost(&starget->dev);
912 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
913 struct sas_rphy *rphy;
914 struct mptsas_portinfo *p;
916 MPT_ADAPTER *ioc = hd->ioc;
918 if (!starget->hostdata)
921 if (starget->channel == MPTSAS_RAID_CHANNEL)
924 rphy = dev_to_rphy(starget->dev.parent);
925 list_for_each_entry(p, &ioc->sas_topology, list) {
926 for (i = 0; i < p->num_phys; i++) {
927 if (p->phy_info[i].attached.sas_address !=
928 rphy->identify.sas_address)
930 mptsas_set_starget(&p->phy_info[i], NULL);
936 kfree(starget->hostdata);
937 starget->hostdata = NULL;
942 mptsas_slave_alloc(struct scsi_device *sdev)
944 struct Scsi_Host *host = sdev->host;
945 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
946 struct sas_rphy *rphy;
947 struct mptsas_portinfo *p;
949 struct scsi_target *starget;
951 MPT_ADAPTER *ioc = hd->ioc;
953 vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
955 printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
956 ioc->name, sizeof(VirtDevice));
959 starget = scsi_target(sdev);
960 vdevice->vtarget = starget->hostdata;
962 if (sdev->channel == MPTSAS_RAID_CHANNEL)
965 rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
966 mutex_lock(&ioc->sas_topology_mutex);
967 list_for_each_entry(p, &ioc->sas_topology, list) {
968 for (i = 0; i < p->num_phys; i++) {
969 if (p->phy_info[i].attached.sas_address !=
970 rphy->identify.sas_address)
972 vdevice->lun = sdev->lun;
974 * Exposing hidden raid components
976 if (mptscsih_is_phys_disk(ioc,
977 p->phy_info[i].attached.channel,
978 p->phy_info[i].attached.id))
979 sdev->no_uld_attach = 1;
980 mutex_unlock(&ioc->sas_topology_mutex);
984 mutex_unlock(&ioc->sas_topology_mutex);
990 vdevice->vtarget->num_luns++;
991 sdev->hostdata = vdevice;
996 mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
998 VirtDevice *vdevice = SCpnt->device->hostdata;
1000 if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {
1001 SCpnt->result = DID_NO_CONNECT << 16;
1006 // scsi_print_command(SCpnt);
1008 return mptscsih_qcmd(SCpnt,done);
1012 static struct scsi_host_template mptsas_driver_template = {
1013 .module = THIS_MODULE,
1014 .proc_name = "mptsas",
1015 .proc_info = mptscsih_proc_info,
1016 .name = "MPT SPI Host",
1017 .info = mptscsih_info,
1018 .queuecommand = mptsas_qcmd,
1019 .target_alloc = mptsas_target_alloc,
1020 .slave_alloc = mptsas_slave_alloc,
1021 .slave_configure = mptsas_slave_configure,
1022 .target_destroy = mptsas_target_destroy,
1023 .slave_destroy = mptscsih_slave_destroy,
1024 .change_queue_depth = mptscsih_change_queue_depth,
1025 .eh_abort_handler = mptscsih_abort,
1026 .eh_device_reset_handler = mptscsih_dev_reset,
1027 .eh_bus_reset_handler = mptscsih_bus_reset,
1028 .eh_host_reset_handler = mptscsih_host_reset,
1029 .bios_param = mptscsih_bios_param,
1030 .can_queue = MPT_FC_CAN_QUEUE,
1032 .sg_tablesize = MPT_SCSI_SG_DEPTH,
1033 .max_sectors = 8192,
1035 .use_clustering = ENABLE_CLUSTERING,
1036 .shost_attrs = mptscsih_host_attrs,
1039 static int mptsas_get_linkerrors(struct sas_phy *phy)
1041 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1042 ConfigExtendedPageHeader_t hdr;
1044 SasPhyPage1_t *buffer;
1045 dma_addr_t dma_handle;
1048 /* FIXME: only have link errors on local phys */
1049 if (!scsi_is_sas_phy_local(phy))
1052 hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
1053 hdr.ExtPageLength = 0;
1054 hdr.PageNumber = 1 /* page number 1*/;
1057 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1058 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1060 cfg.cfghdr.ehdr = &hdr;
1062 cfg.pageAddr = phy->identify.phy_identifier;
1063 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1064 cfg.dir = 0; /* read */
1067 error = mpt_config(ioc, &cfg);
1070 if (!hdr.ExtPageLength)
1073 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1078 cfg.physAddr = dma_handle;
1079 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1081 error = mpt_config(ioc, &cfg);
1083 goto out_free_consistent;
1085 mptsas_print_phy_pg1(ioc, buffer);
1087 phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
1088 phy->running_disparity_error_count =
1089 le32_to_cpu(buffer->RunningDisparityErrorCount);
1090 phy->loss_of_dword_sync_count =
1091 le32_to_cpu(buffer->LossDwordSynchCount);
1092 phy->phy_reset_problem_count =
1093 le32_to_cpu(buffer->PhyResetProblemCount);
1095 out_free_consistent:
1096 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1097 buffer, dma_handle);
1101 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
1102 MPT_FRAME_HDR *reply)
1104 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
1105 if (reply != NULL) {
1106 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
1107 memcpy(ioc->sas_mgmt.reply, reply,
1108 min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
1110 complete(&ioc->sas_mgmt.done);
1114 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
1116 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1117 SasIoUnitControlRequest_t *req;
1118 SasIoUnitControlReply_t *reply;
1121 unsigned long timeleft;
1122 int error = -ERESTARTSYS;
1124 /* FIXME: fusion doesn't allow non-local phy reset */
1125 if (!scsi_is_sas_phy_local(phy))
1128 /* not implemented for expanders */
1129 if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
1132 if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
1135 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1141 hdr = (MPIHeader_t *) mf;
1142 req = (SasIoUnitControlRequest_t *)mf;
1143 memset(req, 0, sizeof(SasIoUnitControlRequest_t));
1144 req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
1145 req->MsgContext = hdr->MsgContext;
1146 req->Operation = hard_reset ?
1147 MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
1148 req->PhyNum = phy->identify.phy_identifier;
1150 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1152 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
1155 /* On timeout reset the board */
1156 mpt_free_msg_frame(ioc, mf);
1157 mpt_HardResetHandler(ioc, CAN_SLEEP);
1162 /* a reply frame is expected */
1163 if ((ioc->sas_mgmt.status &
1164 MPT_IOCTL_STATUS_RF_VALID) == 0) {
1169 /* process the completed Reply Message Frame */
1170 reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
1171 if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
1172 printk(MYIOC_s_INFO_FMT "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
1173 ioc->name, __FUNCTION__, reply->IOCStatus, reply->IOCLogInfo);
1181 mutex_unlock(&ioc->sas_mgmt.mutex);
1187 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
1189 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1191 struct mptsas_portinfo *p;
1192 struct mptsas_enclosure enclosure_info;
1193 u64 enclosure_handle;
1195 mutex_lock(&ioc->sas_topology_mutex);
1196 list_for_each_entry(p, &ioc->sas_topology, list) {
1197 for (i = 0; i < p->num_phys; i++) {
1198 if (p->phy_info[i].attached.sas_address ==
1199 rphy->identify.sas_address) {
1200 enclosure_handle = p->phy_info[i].
1201 attached.handle_enclosure;
1206 mutex_unlock(&ioc->sas_topology_mutex);
1210 mutex_unlock(&ioc->sas_topology_mutex);
1211 memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
1212 error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
1213 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
1214 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
1216 *identifier = enclosure_info.enclosure_logical_id;
1221 mptsas_get_bay_identifier(struct sas_rphy *rphy)
1223 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1224 struct mptsas_portinfo *p;
1227 mutex_lock(&ioc->sas_topology_mutex);
1228 list_for_each_entry(p, &ioc->sas_topology, list) {
1229 for (i = 0; i < p->num_phys; i++) {
1230 if (p->phy_info[i].attached.sas_address ==
1231 rphy->identify.sas_address) {
1232 rc = p->phy_info[i].attached.slot;
1239 mutex_unlock(&ioc->sas_topology_mutex);
1243 static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
1244 struct request *req)
1246 MPT_ADAPTER *ioc = ((MPT_SCSI_HOST *) shost->hostdata)->ioc;
1248 SmpPassthroughRequest_t *smpreq;
1249 struct request *rsp = req->next_rq;
1252 unsigned long timeleft;
1254 dma_addr_t dma_addr_in = 0;
1255 dma_addr_t dma_addr_out = 0;
1256 u64 sas_address = 0;
1259 printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n",
1260 ioc->name, __FUNCTION__);
1264 /* do we need to support multiple segments? */
1265 if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) {
1266 printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n",
1267 ioc->name, __FUNCTION__, req->bio->bi_vcnt, req->data_len,
1268 rsp->bio->bi_vcnt, rsp->data_len);
1272 ret = mutex_lock_interruptible(&ioc->sas_mgmt.mutex);
1276 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1282 smpreq = (SmpPassthroughRequest_t *)mf;
1283 memset(smpreq, 0, sizeof(*smpreq));
1285 smpreq->RequestDataLength = cpu_to_le16(req->data_len - 4);
1286 smpreq->Function = MPI_FUNCTION_SMP_PASSTHROUGH;
1289 sas_address = rphy->identify.sas_address;
1291 struct mptsas_portinfo *port_info;
1293 mutex_lock(&ioc->sas_topology_mutex);
1294 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
1295 if (port_info && port_info->phy_info)
1297 port_info->phy_info[0].phy->identify.sas_address;
1298 mutex_unlock(&ioc->sas_topology_mutex);
1301 *((u64 *)&smpreq->SASAddress) = cpu_to_le64(sas_address);
1304 (((int *) mf) + (offsetof(SmpPassthroughRequest_t, SGL) / 4));
1307 flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT |
1308 MPI_SGE_FLAGS_END_OF_BUFFER |
1309 MPI_SGE_FLAGS_DIRECTION |
1310 mpt_addr_size()) << MPI_SGE_FLAGS_SHIFT;
1311 flagsLength |= (req->data_len - 4);
1313 dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio),
1314 req->data_len, PCI_DMA_BIDIRECTIONAL);
1317 mpt_add_sge(psge, flagsLength, dma_addr_out);
1318 psge += (sizeof(u32) + sizeof(dma_addr_t));
1321 flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ;
1322 flagsLength |= rsp->data_len + 4;
1323 dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio),
1324 rsp->data_len, PCI_DMA_BIDIRECTIONAL);
1327 mpt_add_sge(psge, flagsLength, dma_addr_in);
1329 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1331 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
1333 printk(MYIOC_s_ERR_FMT "%s: smp timeout!\n", ioc->name, __FUNCTION__);
1334 /* On timeout reset the board */
1335 mpt_HardResetHandler(ioc, CAN_SLEEP);
1341 if (ioc->sas_mgmt.status & MPT_IOCTL_STATUS_RF_VALID) {
1342 SmpPassthroughReply_t *smprep;
1344 smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply;
1345 memcpy(req->sense, smprep, sizeof(*smprep));
1346 req->sense_len = sizeof(*smprep);
1348 printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n",
1349 ioc->name, __FUNCTION__);
1354 pci_unmap_single(ioc->pcidev, dma_addr_out, req->data_len,
1355 PCI_DMA_BIDIRECTIONAL);
1357 pci_unmap_single(ioc->pcidev, dma_addr_in, rsp->data_len,
1358 PCI_DMA_BIDIRECTIONAL);
1361 mpt_free_msg_frame(ioc, mf);
1363 mutex_unlock(&ioc->sas_mgmt.mutex);
1368 static struct sas_function_template mptsas_transport_functions = {
1369 .get_linkerrors = mptsas_get_linkerrors,
1370 .get_enclosure_identifier = mptsas_get_enclosure_identifier,
1371 .get_bay_identifier = mptsas_get_bay_identifier,
1372 .phy_reset = mptsas_phy_reset,
1373 .smp_handler = mptsas_smp_handler,
1376 static struct scsi_transport_template *mptsas_transport_template;
1379 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
1381 ConfigExtendedPageHeader_t hdr;
1383 SasIOUnitPage0_t *buffer;
1384 dma_addr_t dma_handle;
1387 hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
1388 hdr.ExtPageLength = 0;
1392 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1393 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1395 cfg.cfghdr.ehdr = &hdr;
1398 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1399 cfg.dir = 0; /* read */
1402 error = mpt_config(ioc, &cfg);
1405 if (!hdr.ExtPageLength) {
1410 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1417 cfg.physAddr = dma_handle;
1418 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1420 error = mpt_config(ioc, &cfg);
1422 goto out_free_consistent;
1424 port_info->num_phys = buffer->NumPhys;
1425 port_info->phy_info = kcalloc(port_info->num_phys,
1426 sizeof(*port_info->phy_info),GFP_KERNEL);
1427 if (!port_info->phy_info) {
1429 goto out_free_consistent;
1432 ioc->nvdata_version_persistent =
1433 le16_to_cpu(buffer->NvdataVersionPersistent);
1434 ioc->nvdata_version_default =
1435 le16_to_cpu(buffer->NvdataVersionDefault);
1437 for (i = 0; i < port_info->num_phys; i++) {
1438 mptsas_print_phy_data(ioc, &buffer->PhyData[i]);
1439 port_info->phy_info[i].phy_id = i;
1440 port_info->phy_info[i].port_id =
1441 buffer->PhyData[i].Port;
1442 port_info->phy_info[i].negotiated_link_rate =
1443 buffer->PhyData[i].NegotiatedLinkRate;
1444 port_info->phy_info[i].portinfo = port_info;
1445 port_info->phy_info[i].handle =
1446 le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
1449 out_free_consistent:
1450 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1451 buffer, dma_handle);
1457 mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc)
1459 ConfigExtendedPageHeader_t hdr;
1461 SasIOUnitPage1_t *buffer;
1462 dma_addr_t dma_handle;
1464 u16 device_missing_delay;
1466 memset(&hdr, 0, sizeof(ConfigExtendedPageHeader_t));
1467 memset(&cfg, 0, sizeof(CONFIGPARMS));
1469 cfg.cfghdr.ehdr = &hdr;
1470 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1472 cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1473 cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1474 cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION;
1475 cfg.cfghdr.ehdr->PageNumber = 1;
1477 error = mpt_config(ioc, &cfg);
1480 if (!hdr.ExtPageLength) {
1485 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1492 cfg.physAddr = dma_handle;
1493 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1495 error = mpt_config(ioc, &cfg);
1497 goto out_free_consistent;
1499 ioc->io_missing_delay =
1500 le16_to_cpu(buffer->IODeviceMissingDelay);
1501 device_missing_delay = le16_to_cpu(buffer->ReportDeviceMissingDelay);
1502 ioc->device_missing_delay = (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) ?
1503 (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16 :
1504 device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK;
1506 out_free_consistent:
1507 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1508 buffer, dma_handle);
1514 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1515 u32 form, u32 form_specific)
1517 ConfigExtendedPageHeader_t hdr;
1519 SasPhyPage0_t *buffer;
1520 dma_addr_t dma_handle;
1523 hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
1524 hdr.ExtPageLength = 0;
1528 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1529 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1531 cfg.cfghdr.ehdr = &hdr;
1532 cfg.dir = 0; /* read */
1535 /* Get Phy Pg 0 for each Phy. */
1537 cfg.pageAddr = form + form_specific;
1538 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1540 error = mpt_config(ioc, &cfg);
1544 if (!hdr.ExtPageLength) {
1549 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1556 cfg.physAddr = dma_handle;
1557 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1559 error = mpt_config(ioc, &cfg);
1561 goto out_free_consistent;
1563 mptsas_print_phy_pg0(ioc, buffer);
1565 phy_info->hw_link_rate = buffer->HwLinkRate;
1566 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1567 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1568 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1570 out_free_consistent:
1571 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1572 buffer, dma_handle);
1578 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
1579 u32 form, u32 form_specific)
1581 ConfigExtendedPageHeader_t hdr;
1583 SasDevicePage0_t *buffer;
1584 dma_addr_t dma_handle;
1588 if (ioc->sas_discovery_runtime &&
1589 mptsas_is_end_device(device_info))
1592 hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
1593 hdr.ExtPageLength = 0;
1597 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1598 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
1600 cfg.cfghdr.ehdr = &hdr;
1601 cfg.pageAddr = form + form_specific;
1603 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1604 cfg.dir = 0; /* read */
1607 memset(device_info, 0, sizeof(struct mptsas_devinfo));
1608 error = mpt_config(ioc, &cfg);
1611 if (!hdr.ExtPageLength) {
1616 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1623 cfg.physAddr = dma_handle;
1624 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1626 error = mpt_config(ioc, &cfg);
1628 goto out_free_consistent;
1630 mptsas_print_device_pg0(ioc, buffer);
1632 device_info->handle = le16_to_cpu(buffer->DevHandle);
1633 device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
1634 device_info->handle_enclosure =
1635 le16_to_cpu(buffer->EnclosureHandle);
1636 device_info->slot = le16_to_cpu(buffer->Slot);
1637 device_info->phy_id = buffer->PhyNum;
1638 device_info->port_id = buffer->PhysicalPort;
1639 device_info->id = buffer->TargetID;
1640 device_info->phys_disk_num = ~0;
1641 device_info->channel = buffer->Bus;
1642 memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
1643 device_info->sas_address = le64_to_cpu(sas_address);
1644 device_info->device_info =
1645 le32_to_cpu(buffer->DeviceInfo);
1647 out_free_consistent:
1648 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1649 buffer, dma_handle);
1655 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
1656 u32 form, u32 form_specific)
1658 ConfigExtendedPageHeader_t hdr;
1660 SasExpanderPage0_t *buffer;
1661 dma_addr_t dma_handle;
1664 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1665 hdr.ExtPageLength = 0;
1669 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1670 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1672 cfg.cfghdr.ehdr = &hdr;
1674 cfg.pageAddr = form + form_specific;
1675 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1676 cfg.dir = 0; /* read */
1679 memset(port_info, 0, sizeof(struct mptsas_portinfo));
1680 error = mpt_config(ioc, &cfg);
1684 if (!hdr.ExtPageLength) {
1689 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1696 cfg.physAddr = dma_handle;
1697 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1699 error = mpt_config(ioc, &cfg);
1701 goto out_free_consistent;
1703 /* save config data */
1704 port_info->num_phys = buffer->NumPhys;
1705 port_info->phy_info = kcalloc(port_info->num_phys,
1706 sizeof(*port_info->phy_info),GFP_KERNEL);
1707 if (!port_info->phy_info) {
1709 goto out_free_consistent;
1712 for (i = 0; i < port_info->num_phys; i++) {
1713 port_info->phy_info[i].portinfo = port_info;
1714 port_info->phy_info[i].handle =
1715 le16_to_cpu(buffer->DevHandle);
1718 out_free_consistent:
1719 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1720 buffer, dma_handle);
1726 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1727 u32 form, u32 form_specific)
1729 ConfigExtendedPageHeader_t hdr;
1731 SasExpanderPage1_t *buffer;
1732 dma_addr_t dma_handle;
1735 if (ioc->sas_discovery_runtime &&
1736 mptsas_is_end_device(&phy_info->attached))
1739 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1740 hdr.ExtPageLength = 0;
1744 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1745 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1747 cfg.cfghdr.ehdr = &hdr;
1749 cfg.pageAddr = form + form_specific;
1750 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1751 cfg.dir = 0; /* read */
1754 error = mpt_config(ioc, &cfg);
1758 if (!hdr.ExtPageLength) {
1763 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1770 cfg.physAddr = dma_handle;
1771 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1773 error = mpt_config(ioc, &cfg);
1775 goto out_free_consistent;
1778 mptsas_print_expander_pg1(ioc, buffer);
1780 /* save config data */
1781 phy_info->phy_id = buffer->PhyIdentifier;
1782 phy_info->port_id = buffer->PhysicalPort;
1783 phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1784 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1785 phy_info->hw_link_rate = buffer->HwLinkRate;
1786 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1787 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1789 out_free_consistent:
1790 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1791 buffer, dma_handle);
1797 mptsas_parse_device_info(struct sas_identify *identify,
1798 struct mptsas_devinfo *device_info)
1802 identify->sas_address = device_info->sas_address;
1803 identify->phy_identifier = device_info->phy_id;
1806 * Fill in Phy Initiator Port Protocol.
1807 * Bits 6:3, more than one bit can be set, fall through cases.
1809 protocols = device_info->device_info & 0x78;
1810 identify->initiator_port_protocols = 0;
1811 if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1812 identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1813 if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1814 identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1815 if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1816 identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1817 if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1818 identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1821 * Fill in Phy Target Port Protocol.
1822 * Bits 10:7, more than one bit can be set, fall through cases.
1824 protocols = device_info->device_info & 0x780;
1825 identify->target_port_protocols = 0;
1826 if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1827 identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1828 if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1829 identify->target_port_protocols |= SAS_PROTOCOL_STP;
1830 if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1831 identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1832 if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1833 identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1836 * Fill in Attached device type.
1838 switch (device_info->device_info &
1839 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1840 case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1841 identify->device_type = SAS_PHY_UNUSED;
1843 case MPI_SAS_DEVICE_INFO_END_DEVICE:
1844 identify->device_type = SAS_END_DEVICE;
1846 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1847 identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1849 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1850 identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1855 static int mptsas_probe_one_phy(struct device *dev,
1856 struct mptsas_phyinfo *phy_info, int index, int local)
1859 struct sas_phy *phy;
1860 struct sas_port *port;
1868 if (!phy_info->phy) {
1869 phy = sas_phy_alloc(dev, index);
1875 phy = phy_info->phy;
1877 mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1880 * Set Negotiated link rate.
1882 switch (phy_info->negotiated_link_rate) {
1883 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1884 phy->negotiated_linkrate = SAS_PHY_DISABLED;
1886 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1887 phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1889 case MPI_SAS_IOUNIT0_RATE_1_5:
1890 phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1892 case MPI_SAS_IOUNIT0_RATE_3_0:
1893 phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1895 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1896 case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1898 phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1903 * Set Max hardware link rate.
1905 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1906 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1907 phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1909 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1910 phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1917 * Set Max programmed link rate.
1919 switch (phy_info->programmed_link_rate &
1920 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1921 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1922 phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1924 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1925 phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1932 * Set Min hardware link rate.
1934 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1935 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1936 phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1938 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1939 phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1946 * Set Min programmed link rate.
1948 switch (phy_info->programmed_link_rate &
1949 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1950 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1951 phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1953 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1954 phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1960 if (!phy_info->phy) {
1962 error = sas_phy_add(phy);
1967 phy_info->phy = phy;
1970 if (!phy_info->attached.handle ||
1971 !phy_info->port_details)
1974 port = mptsas_get_port(phy_info);
1975 ioc = phy_to_ioc(phy_info->phy);
1977 if (phy_info->sas_port_add_phy) {
1980 port = sas_port_alloc_num(dev);
1985 error = sas_port_add(port);
1987 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1988 "%s: exit at line=%d\n", ioc->name,
1989 __FUNCTION__, __LINE__));
1992 mptsas_set_port(ioc, phy_info, port);
1993 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1994 "sas_port_alloc: port=%p dev=%p port_id=%d\n",
1995 ioc->name, port, dev, port->port_identifier));
1997 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n",
1998 ioc->name, phy_info->phy_id));
1999 sas_port_add_phy(port, phy_info->phy);
2000 phy_info->sas_port_add_phy = 0;
2003 if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
2005 struct sas_rphy *rphy;
2006 struct device *parent;
2007 struct sas_identify identify;
2009 parent = dev->parent->parent;
2011 * Let the hotplug_work thread handle processing
2012 * the adding/removing of devices that occur
2013 * after start of day.
2015 if (ioc->sas_discovery_runtime &&
2016 mptsas_is_end_device(&phy_info->attached))
2019 mptsas_parse_device_info(&identify, &phy_info->attached);
2020 if (scsi_is_host_device(parent)) {
2021 struct mptsas_portinfo *port_info;
2024 mutex_lock(&ioc->sas_topology_mutex);
2025 port_info = mptsas_find_portinfo_by_handle(ioc,
2027 mutex_unlock(&ioc->sas_topology_mutex);
2029 for (i = 0; i < port_info->num_phys; i++)
2030 if (port_info->phy_info[i].identify.sas_address ==
2031 identify.sas_address) {
2032 sas_port_mark_backlink(port);
2036 } else if (scsi_is_sas_rphy(parent)) {
2037 struct sas_rphy *parent_rphy = dev_to_rphy(parent);
2038 if (identify.sas_address ==
2039 parent_rphy->identify.sas_address) {
2040 sas_port_mark_backlink(port);
2045 switch (identify.device_type) {
2046 case SAS_END_DEVICE:
2047 rphy = sas_end_device_alloc(port);
2049 case SAS_EDGE_EXPANDER_DEVICE:
2050 case SAS_FANOUT_EXPANDER_DEVICE:
2051 rphy = sas_expander_alloc(port, identify.device_type);
2058 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2059 "%s: exit at line=%d\n", ioc->name,
2060 __FUNCTION__, __LINE__));
2064 rphy->identify = identify;
2065 error = sas_rphy_add(rphy);
2067 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2068 "%s: exit at line=%d\n", ioc->name,
2069 __FUNCTION__, __LINE__));
2070 sas_rphy_free(rphy);
2073 mptsas_set_rphy(ioc, phy_info, rphy);
2081 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
2083 struct mptsas_portinfo *port_info, *hba;
2084 int error = -ENOMEM, i;
2086 hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
2090 error = mptsas_sas_io_unit_pg0(ioc, hba);
2092 goto out_free_port_info;
2094 mptsas_sas_io_unit_pg1(ioc);
2095 mutex_lock(&ioc->sas_topology_mutex);
2096 ioc->handle = hba->phy_info[0].handle;
2097 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
2100 list_add_tail(&port_info->list, &ioc->sas_topology);
2102 for (i = 0; i < hba->num_phys; i++) {
2103 port_info->phy_info[i].negotiated_link_rate =
2104 hba->phy_info[i].negotiated_link_rate;
2105 port_info->phy_info[i].handle =
2106 hba->phy_info[i].handle;
2107 port_info->phy_info[i].port_id =
2108 hba->phy_info[i].port_id;
2110 kfree(hba->phy_info);
2114 mutex_unlock(&ioc->sas_topology_mutex);
2115 for (i = 0; i < port_info->num_phys; i++) {
2116 mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
2117 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
2118 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
2120 mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
2121 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2122 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2123 port_info->phy_info[i].handle);
2124 port_info->phy_info[i].identify.phy_id =
2125 port_info->phy_info[i].phy_id = i;
2126 if (port_info->phy_info[i].attached.handle)
2127 mptsas_sas_device_pg0(ioc,
2128 &port_info->phy_info[i].attached,
2129 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2130 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2131 port_info->phy_info[i].attached.handle);
2134 mptsas_setup_wide_ports(ioc, port_info);
2136 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2137 mptsas_probe_one_phy(&ioc->sh->shost_gendev,
2138 &port_info->phy_info[i], ioc->sas_index, 1);
2149 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
2151 struct mptsas_portinfo *port_info, *p, *ex;
2152 struct device *parent;
2153 struct sas_rphy *rphy;
2154 int error = -ENOMEM, i, j;
2156 ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
2160 error = mptsas_sas_expander_pg0(ioc, ex,
2161 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
2162 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
2164 goto out_free_port_info;
2166 *handle = ex->phy_info[0].handle;
2168 mutex_lock(&ioc->sas_topology_mutex);
2169 port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
2172 list_add_tail(&port_info->list, &ioc->sas_topology);
2174 for (i = 0; i < ex->num_phys; i++) {
2175 port_info->phy_info[i].handle =
2176 ex->phy_info[i].handle;
2177 port_info->phy_info[i].port_id =
2178 ex->phy_info[i].port_id;
2180 kfree(ex->phy_info);
2184 mutex_unlock(&ioc->sas_topology_mutex);
2186 for (i = 0; i < port_info->num_phys; i++) {
2187 mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
2188 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
2189 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
2191 if (port_info->phy_info[i].identify.handle) {
2192 mptsas_sas_device_pg0(ioc,
2193 &port_info->phy_info[i].identify,
2194 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2195 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2196 port_info->phy_info[i].identify.handle);
2197 port_info->phy_info[i].identify.phy_id =
2198 port_info->phy_info[i].phy_id;
2201 if (port_info->phy_info[i].attached.handle) {
2202 mptsas_sas_device_pg0(ioc,
2203 &port_info->phy_info[i].attached,
2204 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2205 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2206 port_info->phy_info[i].attached.handle);
2207 port_info->phy_info[i].attached.phy_id =
2208 port_info->phy_info[i].phy_id;
2212 parent = &ioc->sh->shost_gendev;
2213 for (i = 0; i < port_info->num_phys; i++) {
2214 mutex_lock(&ioc->sas_topology_mutex);
2215 list_for_each_entry(p, &ioc->sas_topology, list) {
2216 for (j = 0; j < p->num_phys; j++) {
2217 if (port_info->phy_info[i].identify.handle !=
2218 p->phy_info[j].attached.handle)
2220 rphy = mptsas_get_rphy(&p->phy_info[j]);
2221 parent = &rphy->dev;
2224 mutex_unlock(&ioc->sas_topology_mutex);
2227 mptsas_setup_wide_ports(ioc, port_info);
2229 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2230 mptsas_probe_one_phy(parent, &port_info->phy_info[i],
2237 kfree(ex->phy_info);
2245 * mptsas_delete_expander_phys
2248 * This will traverse topology, and remove expanders
2249 * that are no longer present
2252 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
2254 struct mptsas_portinfo buffer;
2255 struct mptsas_portinfo *port_info, *n, *parent;
2256 struct mptsas_phyinfo *phy_info;
2257 struct sas_port * port;
2259 u64 expander_sas_address;
2261 mutex_lock(&ioc->sas_topology_mutex);
2262 list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
2264 if (port_info->phy_info &&
2265 (!(port_info->phy_info[0].identify.device_info &
2266 MPI_SAS_DEVICE_INFO_SMP_TARGET)))
2269 if (mptsas_sas_expander_pg0(ioc, &buffer,
2270 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
2271 MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
2272 port_info->phy_info[0].handle)) {
2275 * Obtain the port_info instance to the parent port
2277 parent = mptsas_find_portinfo_by_handle(ioc,
2278 port_info->phy_info[0].identify.handle_parent);
2283 expander_sas_address =
2284 port_info->phy_info[0].identify.sas_address;
2287 * Delete rphys in the parent that point
2288 * to this expander. The transport layer will
2289 * cleanup all the children.
2291 phy_info = parent->phy_info;
2292 for (i = 0; i < parent->num_phys; i++, phy_info++) {
2293 port = mptsas_get_port(phy_info);
2296 if (phy_info->attached.sas_address !=
2297 expander_sas_address)
2300 dev_printk(MYIOC_s_DEBUG_FMT, &port->dev,
2301 "delete port (%d)\n", ioc->name, port->port_identifier));
2302 sas_port_delete(port);
2303 mptsas_port_delete(ioc, phy_info->port_details);
2307 phy_info = port_info->phy_info;
2308 for (i = 0; i < port_info->num_phys; i++, phy_info++)
2309 mptsas_port_delete(ioc, phy_info->port_details);
2311 list_del(&port_info->list);
2312 kfree(port_info->phy_info);
2316 * Free this memory allocated from inside
2317 * mptsas_sas_expander_pg0
2319 kfree(buffer.phy_info);
2321 mutex_unlock(&ioc->sas_topology_mutex);
2325 * Start of day discovery
2328 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
2330 u32 handle = 0xFFFF;
2333 mutex_lock(&ioc->sas_discovery_mutex);
2334 mptsas_probe_hba_phys(ioc);
2335 while (!mptsas_probe_expander_phys(ioc, &handle))
2338 Reporting RAID volumes.
2340 if (!ioc->ir_firmware)
2342 if (!ioc->raid_data.pIocPg2)
2344 if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
2346 for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
2347 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
2348 ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
2351 mutex_unlock(&ioc->sas_discovery_mutex);
2355 * Work queue thread to handle Runtime discovery
2356 * Mere purpose is the hot add/delete of expanders
2360 __mptsas_discovery_work(MPT_ADAPTER *ioc)
2362 u32 handle = 0xFFFF;
2364 ioc->sas_discovery_runtime=1;
2365 mptsas_delete_expander_phys(ioc);
2366 mptsas_probe_hba_phys(ioc);
2367 while (!mptsas_probe_expander_phys(ioc, &handle))
2369 ioc->sas_discovery_runtime=0;
2373 * Work queue thread to handle Runtime discovery
2374 * Mere purpose is the hot add/delete of expanders
2378 mptsas_discovery_work(struct work_struct *work)
2380 struct mptsas_discovery_event *ev =
2381 container_of(work, struct mptsas_discovery_event, work);
2382 MPT_ADAPTER *ioc = ev->ioc;
2384 mutex_lock(&ioc->sas_discovery_mutex);
2385 __mptsas_discovery_work(ioc);
2386 mutex_unlock(&ioc->sas_discovery_mutex);
2390 static struct mptsas_phyinfo *
2391 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
2393 struct mptsas_portinfo *port_info;
2394 struct mptsas_phyinfo *phy_info = NULL;
2397 mutex_lock(&ioc->sas_topology_mutex);
2398 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2399 for (i = 0; i < port_info->num_phys; i++) {
2400 if (!mptsas_is_end_device(
2401 &port_info->phy_info[i].attached))
2403 if (port_info->phy_info[i].attached.sas_address
2406 phy_info = &port_info->phy_info[i];
2410 mutex_unlock(&ioc->sas_topology_mutex);
2414 static struct mptsas_phyinfo *
2415 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
2417 struct mptsas_portinfo *port_info;
2418 struct mptsas_phyinfo *phy_info = NULL;
2421 mutex_lock(&ioc->sas_topology_mutex);
2422 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2423 for (i = 0; i < port_info->num_phys; i++) {
2424 if (!mptsas_is_end_device(
2425 &port_info->phy_info[i].attached))
2427 if (port_info->phy_info[i].attached.id != id)
2429 if (port_info->phy_info[i].attached.channel != channel)
2431 phy_info = &port_info->phy_info[i];
2435 mutex_unlock(&ioc->sas_topology_mutex);
2439 static struct mptsas_phyinfo *
2440 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
2442 struct mptsas_portinfo *port_info;
2443 struct mptsas_phyinfo *phy_info = NULL;
2446 mutex_lock(&ioc->sas_topology_mutex);
2447 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2448 for (i = 0; i < port_info->num_phys; i++) {
2449 if (!mptsas_is_end_device(
2450 &port_info->phy_info[i].attached))
2452 if (port_info->phy_info[i].attached.phys_disk_num == ~0)
2454 if (port_info->phy_info[i].attached.phys_disk_num != id)
2456 if (port_info->phy_info[i].attached.channel != channel)
2458 phy_info = &port_info->phy_info[i];
2462 mutex_unlock(&ioc->sas_topology_mutex);
2467 * Work queue thread to clear the persitency table
2470 mptsas_persist_clear_table(struct work_struct *work)
2472 MPT_ADAPTER *ioc = container_of(work, MPT_ADAPTER, sas_persist_task);
2474 mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
2478 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
2482 sdev->no_uld_attach = data ? 1 : 0;
2483 rc = scsi_device_reprobe(sdev);
2487 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
2489 starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
2490 mptsas_reprobe_lun);
2494 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
2497 ConfigPageHeader_t hdr;
2498 dma_addr_t dma_handle;
2499 pRaidVolumePage0_t buffer = NULL;
2500 RaidPhysDiskPage0_t phys_disk;
2502 struct mptsas_hotplug_event *ev;
2504 memset(&cfg, 0 , sizeof(CONFIGPARMS));
2505 memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
2506 hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
2507 cfg.pageAddr = (channel << 8) + id;
2508 cfg.cfghdr.hdr = &hdr;
2509 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2511 if (mpt_config(ioc, &cfg) != 0)
2514 if (!hdr.PageLength)
2517 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
2523 cfg.physAddr = dma_handle;
2524 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2526 if (mpt_config(ioc, &cfg) != 0)
2529 if (!(buffer->VolumeStatus.Flags &
2530 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
2533 if (!buffer->NumPhysDisks)
2536 for (i = 0; i < buffer->NumPhysDisks; i++) {
2538 if (mpt_raid_phys_disk_pg0(ioc,
2539 buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
2542 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2544 printk(MYIOC_s_WARN_FMT "mptsas: lost hotplug event\n", ioc->name);
2548 INIT_WORK(&ev->work, mptsas_hotplug_work);
2550 ev->id = phys_disk.PhysDiskID;
2551 ev->channel = phys_disk.PhysDiskBus;
2552 ev->phys_disk_num_valid = 1;
2553 ev->phys_disk_num = phys_disk.PhysDiskNum;
2554 ev->event_type = MPTSAS_ADD_DEVICE;
2555 schedule_work(&ev->work);
2560 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
2564 * Work queue thread to handle SAS hotplug events
2567 mptsas_hotplug_work(struct work_struct *work)
2569 struct mptsas_hotplug_event *ev =
2570 container_of(work, struct mptsas_hotplug_event, work);
2572 MPT_ADAPTER *ioc = ev->ioc;
2573 struct mptsas_phyinfo *phy_info;
2574 struct sas_rphy *rphy;
2575 struct sas_port *port;
2576 struct scsi_device *sdev;
2577 struct scsi_target * starget;
2578 struct sas_identify identify;
2580 struct mptsas_devinfo sas_device;
2581 VirtTarget *vtarget;
2582 VirtDevice *vdevice;
2584 mutex_lock(&ioc->sas_discovery_mutex);
2585 switch (ev->event_type) {
2586 case MPTSAS_DEL_DEVICE:
2589 if (ev->phys_disk_num_valid) {
2590 if (ev->hidden_raid_component){
2591 if (mptsas_sas_device_pg0(ioc, &sas_device,
2592 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2593 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2594 (ev->channel << 8) + ev->id)) {
2595 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2596 "%s: exit at line=%d\n", ioc->name,
2597 __FUNCTION__, __LINE__));
2600 phy_info = mptsas_find_phyinfo_by_sas_address(
2601 ioc, sas_device.sas_address);
2603 phy_info = mptsas_find_phyinfo_by_phys_disk_num(
2604 ioc, ev->channel, ev->phys_disk_num);
2608 phy_info = mptsas_find_phyinfo_by_target(ioc,
2609 ev->channel, ev->id);
2612 * Sanity checks, for non-existing phys and remote rphys.
2615 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2616 "%s: exit at line=%d\n", ioc->name,
2617 __FUNCTION__, __LINE__));
2620 if (!phy_info->port_details) {
2621 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2622 "%s: exit at line=%d\n", ioc->name,
2623 __FUNCTION__, __LINE__));
2626 rphy = mptsas_get_rphy(phy_info);
2628 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2629 "%s: exit at line=%d\n", ioc->name,
2630 __FUNCTION__, __LINE__));
2634 port = mptsas_get_port(phy_info);
2636 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2637 "%s: exit at line=%d\n", ioc->name,
2638 __FUNCTION__, __LINE__));
2642 starget = mptsas_get_starget(phy_info);
2644 vtarget = starget->hostdata;
2647 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2648 "%s: exit at line=%d\n", ioc->name,
2649 __FUNCTION__, __LINE__));
2654 * Handling RAID components
2656 if (ev->phys_disk_num_valid &&
2657 ev->hidden_raid_component) {
2658 printk(MYIOC_s_INFO_FMT
2659 "RAID Hidding: channel=%d, id=%d, "
2660 "physdsk %d \n", ioc->name, ev->channel,
2661 ev->id, ev->phys_disk_num);
2662 vtarget->id = ev->phys_disk_num;
2664 MPT_TARGET_FLAGS_RAID_COMPONENT;
2665 mptsas_reprobe_target(starget, 1);
2666 phy_info->attached.phys_disk_num =
2672 if (phy_info->attached.device_info &
2673 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2675 if (phy_info->attached.device_info &
2676 MPI_SAS_DEVICE_INFO_STP_TARGET)
2678 if (phy_info->attached.device_info &
2679 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2682 printk(MYIOC_s_INFO_FMT
2683 "removing %s device, channel %d, id %d, phy %d\n",
2684 ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
2685 dev_printk(MYIOC_s_DEBUG_FMT, &port->dev,
2686 "delete port (%d)\n", ioc->name, port->port_identifier);
2687 sas_port_delete(port);
2688 mptsas_port_delete(ioc, phy_info->port_details);
2690 case MPTSAS_ADD_DEVICE:
2692 if (ev->phys_disk_num_valid)
2693 mpt_findImVolumes(ioc);
2696 * Refresh sas device pg0 data
2698 if (mptsas_sas_device_pg0(ioc, &sas_device,
2699 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2700 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2701 (ev->channel << 8) + ev->id)) {
2702 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2703 "%s: exit at line=%d\n", ioc->name,
2704 __FUNCTION__, __LINE__));
2708 __mptsas_discovery_work(ioc);
2710 phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
2711 sas_device.sas_address);
2713 if (!phy_info || !phy_info->port_details) {
2714 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2715 "%s: exit at line=%d\n", ioc->name,
2716 __FUNCTION__, __LINE__));
2720 starget = mptsas_get_starget(phy_info);
2721 if (starget && (!ev->hidden_raid_component)){
2723 vtarget = starget->hostdata;
2726 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2727 "%s: exit at line=%d\n", ioc->name,
2728 __FUNCTION__, __LINE__));
2732 * Handling RAID components
2734 if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2735 printk(MYIOC_s_INFO_FMT
2736 "RAID Exposing: channel=%d, id=%d, "
2737 "physdsk %d \n", ioc->name, ev->channel,
2738 ev->id, ev->phys_disk_num);
2740 ~MPT_TARGET_FLAGS_RAID_COMPONENT;
2741 vtarget->id = ev->id;
2742 mptsas_reprobe_target(starget, 0);
2743 phy_info->attached.phys_disk_num = ~0;
2748 if (mptsas_get_rphy(phy_info)) {
2749 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2750 "%s: exit at line=%d\n", ioc->name,
2751 __FUNCTION__, __LINE__));
2752 if (ev->channel) printk("%d\n", __LINE__);
2756 port = mptsas_get_port(phy_info);
2758 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2759 "%s: exit at line=%d\n", ioc->name,
2760 __FUNCTION__, __LINE__));
2763 memcpy(&phy_info->attached, &sas_device,
2764 sizeof(struct mptsas_devinfo));
2766 if (phy_info->attached.device_info &
2767 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2769 if (phy_info->attached.device_info &
2770 MPI_SAS_DEVICE_INFO_STP_TARGET)
2772 if (phy_info->attached.device_info &
2773 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2776 printk(MYIOC_s_INFO_FMT
2777 "attaching %s device, channel %d, id %d, phy %d\n",
2778 ioc->name, ds, ev->channel, ev->id, ev->phy_id);
2780 mptsas_parse_device_info(&identify, &phy_info->attached);
2781 rphy = sas_end_device_alloc(port);
2783 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2784 "%s: exit at line=%d\n", ioc->name,
2785 __FUNCTION__, __LINE__));
2786 break; /* non-fatal: an rphy can be added later */
2789 rphy->identify = identify;
2790 if (sas_rphy_add(rphy)) {
2791 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2792 "%s: exit at line=%d\n", ioc->name,
2793 __FUNCTION__, __LINE__));
2794 sas_rphy_free(rphy);
2797 mptsas_set_rphy(ioc, phy_info, rphy);
2799 case MPTSAS_ADD_RAID:
2800 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2803 scsi_device_put(sdev);
2806 printk(MYIOC_s_INFO_FMT
2807 "attaching raid volume, channel %d, id %d\n",
2808 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2809 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
2810 mpt_findImVolumes(ioc);
2812 case MPTSAS_DEL_RAID:
2813 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2817 printk(MYIOC_s_INFO_FMT
2818 "removing raid volume, channel %d, id %d\n",
2819 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2820 vdevice = sdev->hostdata;
2821 scsi_remove_device(sdev);
2822 scsi_device_put(sdev);
2823 mpt_findImVolumes(ioc);
2825 case MPTSAS_ADD_INACTIVE_VOLUME:
2826 mptsas_adding_inactive_raid_components(ioc,
2827 ev->channel, ev->id);
2829 case MPTSAS_IGNORE_EVENT:
2834 mutex_unlock(&ioc->sas_discovery_mutex);
2839 mptsas_send_sas_event(MPT_ADAPTER *ioc,
2840 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
2842 struct mptsas_hotplug_event *ev;
2843 u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
2847 (MPI_SAS_DEVICE_INFO_SSP_TARGET |
2848 MPI_SAS_DEVICE_INFO_STP_TARGET |
2849 MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
2852 switch (sas_event_data->ReasonCode) {
2853 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
2855 mptsas_target_reset_queue(ioc, sas_event_data);
2858 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
2859 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2861 printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
2865 INIT_WORK(&ev->work, mptsas_hotplug_work);
2867 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
2869 le16_to_cpu(sas_event_data->ParentDevHandle);
2870 ev->channel = sas_event_data->Bus;
2871 ev->id = sas_event_data->TargetID;
2872 ev->phy_id = sas_event_data->PhyNum;
2873 memcpy(&sas_address, &sas_event_data->SASAddress,
2875 ev->sas_address = le64_to_cpu(sas_address);
2876 ev->device_info = device_info;
2878 if (sas_event_data->ReasonCode &
2879 MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
2880 ev->event_type = MPTSAS_ADD_DEVICE;
2882 ev->event_type = MPTSAS_DEL_DEVICE;
2883 schedule_work(&ev->work);
2885 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
2887 * Persistent table is full.
2889 INIT_WORK(&ioc->sas_persist_task,
2890 mptsas_persist_clear_table);
2891 schedule_work(&ioc->sas_persist_task);
2894 * TODO, handle other events
2896 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
2897 case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
2898 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
2899 case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
2900 case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
2901 case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
2902 case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
2908 mptsas_send_raid_event(MPT_ADAPTER *ioc,
2909 EVENT_DATA_RAID *raid_event_data)
2911 struct mptsas_hotplug_event *ev;
2912 int status = le32_to_cpu(raid_event_data->SettingsStatus);
2913 int state = (status >> 8) & 0xff;
2915 if (ioc->bus_type != SAS)
2918 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2920 printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
2924 INIT_WORK(&ev->work, mptsas_hotplug_work);
2926 ev->id = raid_event_data->VolumeID;
2927 ev->channel = raid_event_data->VolumeBus;
2928 ev->event_type = MPTSAS_IGNORE_EVENT;
2930 switch (raid_event_data->ReasonCode) {
2931 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
2932 ev->phys_disk_num_valid = 1;
2933 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2934 ev->event_type = MPTSAS_ADD_DEVICE;
2936 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
2937 ev->phys_disk_num_valid = 1;
2938 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2939 ev->hidden_raid_component = 1;
2940 ev->event_type = MPTSAS_DEL_DEVICE;
2942 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
2944 case MPI_PD_STATE_ONLINE:
2945 case MPI_PD_STATE_NOT_COMPATIBLE:
2946 ev->phys_disk_num_valid = 1;
2947 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2948 ev->hidden_raid_component = 1;
2949 ev->event_type = MPTSAS_ADD_DEVICE;
2951 case MPI_PD_STATE_MISSING:
2952 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
2953 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
2954 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
2955 ev->phys_disk_num_valid = 1;
2956 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2957 ev->event_type = MPTSAS_DEL_DEVICE;
2963 case MPI_EVENT_RAID_RC_VOLUME_DELETED:
2964 ev->event_type = MPTSAS_DEL_RAID;
2966 case MPI_EVENT_RAID_RC_VOLUME_CREATED:
2967 ev->event_type = MPTSAS_ADD_RAID;
2969 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
2971 case MPI_RAIDVOL0_STATUS_STATE_FAILED:
2972 case MPI_RAIDVOL0_STATUS_STATE_MISSING:
2973 ev->event_type = MPTSAS_DEL_RAID;
2975 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
2976 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
2977 ev->event_type = MPTSAS_ADD_RAID;
2986 schedule_work(&ev->work);
2990 mptsas_send_discovery_event(MPT_ADAPTER *ioc,
2991 EVENT_DATA_SAS_DISCOVERY *discovery_data)
2993 struct mptsas_discovery_event *ev;
2998 * This flag will be non-zero when firmware
2999 * kicks off discovery, and return to zero
3000 * once its completed.
3002 if (discovery_data->DiscoveryStatus)
3005 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
3008 INIT_WORK(&ev->work, mptsas_discovery_work);
3010 schedule_work(&ev->work);
3014 * mptsas_send_ir2_event - handle exposing hidden disk when
3015 * an inactive raid volume is added
3017 * @ioc: Pointer to MPT_ADAPTER structure
3022 mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
3024 struct mptsas_hotplug_event *ev;
3026 if (ir2_data->ReasonCode !=
3027 MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
3030 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
3034 INIT_WORK(&ev->work, mptsas_hotplug_work);
3036 ev->id = ir2_data->TargetID;
3037 ev->channel = ir2_data->Bus;
3038 ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
3040 schedule_work(&ev->work);
3044 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
3047 u8 event = le32_to_cpu(reply->Event) & 0xFF;
3053 * sas_discovery_ignore_events
3055 * This flag is to prevent anymore processing of
3056 * sas events once mptsas_remove function is called.
3058 if (ioc->sas_discovery_ignore_events) {
3059 rc = mptscsih_event_process(ioc, reply);
3064 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
3065 mptsas_send_sas_event(ioc,
3066 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
3068 case MPI_EVENT_INTEGRATED_RAID:
3069 mptsas_send_raid_event(ioc,
3070 (EVENT_DATA_RAID *)reply->Data);
3072 case MPI_EVENT_PERSISTENT_TABLE_FULL:
3073 INIT_WORK(&ioc->sas_persist_task,
3074 mptsas_persist_clear_table);
3075 schedule_work(&ioc->sas_persist_task);
3077 case MPI_EVENT_SAS_DISCOVERY:
3078 mptsas_send_discovery_event(ioc,
3079 (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
3082 mptsas_send_ir2_event(ioc,
3083 (PTR_MPI_EVENT_DATA_IR2)reply->Data);
3086 rc = mptscsih_event_process(ioc, reply);
3095 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
3097 struct Scsi_Host *sh;
3100 unsigned long flags;
3108 r = mpt_attach(pdev,id);
3112 ioc = pci_get_drvdata(pdev);
3113 ioc->DoneCtx = mptsasDoneCtx;
3114 ioc->TaskCtx = mptsasTaskCtx;
3115 ioc->InternalCtx = mptsasInternalCtx;
3117 /* Added sanity check on readiness of the MPT adapter.
3119 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
3120 printk(MYIOC_s_WARN_FMT
3121 "Skipping because it's not operational!\n",
3124 goto out_mptsas_probe;
3128 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
3131 goto out_mptsas_probe;
3134 /* Sanity check - ensure at least 1 port is INITIATOR capable
3137 for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
3138 if (ioc->pfacts[ii].ProtocolFlags &
3139 MPI_PORTFACTS_PROTOCOL_INITIATOR)
3144 printk(MYIOC_s_WARN_FMT
3145 "Skipping ioc=%p because SCSI Initiator mode "
3146 "is NOT enabled!\n", ioc->name, ioc);
3150 sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
3152 printk(MYIOC_s_WARN_FMT
3153 "Unable to register controller with SCSI subsystem\n",
3156 goto out_mptsas_probe;
3159 spin_lock_irqsave(&ioc->FreeQlock, flags);
3161 /* Attach the SCSI Host to the IOC structure
3169 /* set 16 byte cdb's */
3170 sh->max_cmd_len = 16;
3172 sh->max_id = ioc->pfacts[0].PortSCSIID;
3173 sh->max_lun = max_lun;
3175 sh->transportt = mptsas_transport_template;
3177 sh->this_id = ioc->pfacts[0].PortSCSIID;
3181 sh->unique_id = ioc->id;
3183 INIT_LIST_HEAD(&ioc->sas_topology);
3184 mutex_init(&ioc->sas_topology_mutex);
3185 mutex_init(&ioc->sas_discovery_mutex);
3186 mutex_init(&ioc->sas_mgmt.mutex);
3187 init_completion(&ioc->sas_mgmt.done);
3189 /* Verify that we won't exceed the maximum
3190 * number of chain buffers
3191 * We can optimize: ZZ = req_sz/sizeof(SGE)
3193 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
3194 * + (req_sz - 64)/sizeof(SGE)
3195 * A slightly different algorithm is required for
3198 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
3199 if (sizeof(dma_addr_t) == sizeof(u64)) {
3200 numSGE = (scale - 1) *
3201 (ioc->facts.MaxChainDepth-1) + scale +
3202 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
3205 numSGE = 1 + (scale - 1) *
3206 (ioc->facts.MaxChainDepth-1) + scale +
3207 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
3211 if (numSGE < sh->sg_tablesize) {
3212 /* Reset this value */
3213 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3214 "Resetting sg_tablesize to %d from %d\n",
3215 ioc->name, numSGE, sh->sg_tablesize));
3216 sh->sg_tablesize = numSGE;
3219 hd = (MPT_SCSI_HOST *) sh->hostdata;
3222 /* SCSI needs scsi_cmnd lookup table!
3223 * (with size equal to req_depth*PtrSz!)
3225 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
3226 if (!hd->ScsiLookup) {
3228 goto out_mptsas_probe;
3231 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
3232 ioc->name, hd->ScsiLookup));
3234 /* Clear the TM flags
3237 hd->tmState = TM_STATE_NONE;
3238 hd->resetPending = 0;
3239 hd->abortSCpnt = NULL;
3241 /* Clear the pointer used to store
3242 * single-threaded commands, i.e., those
3243 * issued during a bus scan, dv and
3244 * configuration pages.
3248 /* Initialize this SCSI Hosts' timers
3249 * To use, set the timer expires field
3252 init_timer(&hd->timer);
3253 hd->timer.data = (unsigned long) hd;
3254 hd->timer.function = mptscsih_timer_expired;
3256 ioc->sas_data.ptClear = mpt_pt_clear;
3258 init_waitqueue_head(&hd->scandv_waitq);
3259 hd->scandv_wait_done = 0;
3260 hd->last_queue_full = 0;
3261 INIT_LIST_HEAD(&hd->target_reset_list);
3262 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3264 if (ioc->sas_data.ptClear==1) {
3265 mptbase_sas_persist_operation(
3266 ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
3269 error = scsi_add_host(sh, &ioc->pcidev->dev);
3271 dprintk(ioc, printk(MYIOC_s_ERR_FMT
3272 "scsi_add_host failed\n", ioc->name));
3273 goto out_mptsas_probe;
3276 mptsas_scan_sas_topology(ioc);
3282 mptscsih_remove(pdev);
3286 static void __devexit mptsas_remove(struct pci_dev *pdev)
3288 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
3289 struct mptsas_portinfo *p, *n;
3292 ioc->sas_discovery_ignore_events = 1;
3293 sas_remove_host(ioc->sh);
3295 mutex_lock(&ioc->sas_topology_mutex);
3296 list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
3298 for (i = 0 ; i < p->num_phys ; i++)
3299 mptsas_port_delete(ioc, p->phy_info[i].port_details);
3303 mutex_unlock(&ioc->sas_topology_mutex);
3305 mptscsih_remove(pdev);
3308 static struct pci_device_id mptsas_pci_table[] = {
3309 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
3310 PCI_ANY_ID, PCI_ANY_ID },
3311 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
3312 PCI_ANY_ID, PCI_ANY_ID },
3313 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
3314 PCI_ANY_ID, PCI_ANY_ID },
3315 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
3316 PCI_ANY_ID, PCI_ANY_ID },
3317 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
3318 PCI_ANY_ID, PCI_ANY_ID },
3319 {0} /* Terminating entry */
3321 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
3324 static struct pci_driver mptsas_driver = {
3326 .id_table = mptsas_pci_table,
3327 .probe = mptsas_probe,
3328 .remove = __devexit_p(mptsas_remove),
3329 .shutdown = mptscsih_shutdown,
3331 .suspend = mptscsih_suspend,
3332 .resume = mptscsih_resume,
3341 show_mptmod_ver(my_NAME, my_VERSION);
3343 mptsas_transport_template =
3344 sas_attach_transport(&mptsas_transport_functions);
3345 if (!mptsas_transport_template)
3348 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
3349 mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
3351 mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
3352 mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
3354 mpt_event_register(mptsasDoneCtx, mptsas_event_process);
3355 mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset);
3357 error = pci_register_driver(&mptsas_driver);
3359 sas_release_transport(mptsas_transport_template);
3367 pci_unregister_driver(&mptsas_driver);
3368 sas_release_transport(mptsas_transport_template);
3370 mpt_reset_deregister(mptsasDoneCtx);
3371 mpt_event_deregister(mptsasDoneCtx);
3373 mpt_deregister(mptsasMgmtCtx);
3374 mpt_deregister(mptsasInternalCtx);
3375 mpt_deregister(mptsasTaskCtx);
3376 mpt_deregister(mptsasDoneCtx);
3379 module_init(mptsas_init);
3380 module_exit(mptsas_exit);