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-2008 LSI Corporation
7 * (mailto:DL-MPTFusionLinux@lsi.com)
9 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; version 2 of the License.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
21 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
22 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
23 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
24 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
25 solely responsible for determining the appropriateness of using and
26 distributing the Program and assumes all risks associated with its
27 exercise of rights under this Agreement, including but not limited to
28 the risks and costs of program errors, damage to or loss of data,
29 programs or equipment, and unavailability or interruption of operations.
31 DISCLAIMER OF LIABILITY
32 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
33 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
35 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
36 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
37 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
38 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40 You should have received a copy of the GNU General Public License
41 along with this program; if not, write to the Free Software
42 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
44 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
46 #include <linux/module.h>
47 #include <linux/kernel.h>
48 #include <linux/init.h>
49 #include <linux/errno.h>
50 #include <linux/jiffies.h>
51 #include <linux/workqueue.h>
52 #include <linux/delay.h> /* for mdelay */
54 #include <scsi/scsi.h>
55 #include <scsi/scsi_cmnd.h>
56 #include <scsi/scsi_device.h>
57 #include <scsi/scsi_host.h>
58 #include <scsi/scsi_transport_sas.h>
59 #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 u8 mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
93 static u8 mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
94 static u8 mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
95 static u8 mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;
97 static void mptsas_hotplug_work(struct work_struct *work);
99 static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
100 MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
102 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
103 "---- IO UNIT PAGE 0 ------------\n", ioc->name));
104 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
105 ioc->name, le16_to_cpu(phy_data->AttachedDeviceHandle)));
106 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Controller Handle=0x%X\n",
107 ioc->name, le16_to_cpu(phy_data->ControllerDevHandle)));
108 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port=0x%X\n",
109 ioc->name, phy_data->Port));
110 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port Flags=0x%X\n",
111 ioc->name, phy_data->PortFlags));
112 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Flags=0x%X\n",
113 ioc->name, phy_data->PhyFlags));
114 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
115 ioc->name, phy_data->NegotiatedLinkRate));
116 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
117 "Controller PHY Device Info=0x%X\n", ioc->name,
118 le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
119 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DiscoveryStatus=0x%X\n\n",
120 ioc->name, le32_to_cpu(phy_data->DiscoveryStatus)));
123 static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
127 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
129 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
130 "---- SAS PHY PAGE 0 ------------\n", ioc->name));
131 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
132 "Attached Device Handle=0x%X\n", ioc->name,
133 le16_to_cpu(pg0->AttachedDevHandle)));
134 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
135 ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
136 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
137 "Attached PHY Identifier=0x%X\n", ioc->name,
138 pg0->AttachedPhyIdentifier));
139 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Attached Device Info=0x%X\n",
140 ioc->name, le32_to_cpu(pg0->AttachedDeviceInfo)));
141 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
142 ioc->name, pg0->ProgrammedLinkRate));
143 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Change Count=0x%X\n",
144 ioc->name, pg0->ChangeCount));
145 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Info=0x%X\n\n",
146 ioc->name, le32_to_cpu(pg0->PhyInfo)));
149 static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
151 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
152 "---- SAS PHY PAGE 1 ------------\n", ioc->name));
153 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Invalid Dword Count=0x%x\n",
154 ioc->name, pg1->InvalidDwordCount));
155 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
156 "Running Disparity Error Count=0x%x\n", ioc->name,
157 pg1->RunningDisparityErrorCount));
158 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
159 "Loss Dword Synch Count=0x%x\n", ioc->name,
160 pg1->LossDwordSynchCount));
161 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
162 "PHY Reset Problem Count=0x%x\n\n", ioc->name,
163 pg1->PhyResetProblemCount));
166 static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
170 memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
172 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
173 "---- SAS DEVICE PAGE 0 ---------\n", ioc->name));
174 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
175 ioc->name, le16_to_cpu(pg0->DevHandle)));
176 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Handle=0x%X\n",
177 ioc->name, le16_to_cpu(pg0->ParentDevHandle)));
178 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Enclosure Handle=0x%X\n",
179 ioc->name, le16_to_cpu(pg0->EnclosureHandle)));
180 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Slot=0x%X\n",
181 ioc->name, le16_to_cpu(pg0->Slot)));
182 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
183 ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
184 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Target ID=0x%X\n",
185 ioc->name, pg0->TargetID));
186 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Bus=0x%X\n",
187 ioc->name, pg0->Bus));
188 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Phy Num=0x%X\n",
189 ioc->name, pg0->PhyNum));
190 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Access Status=0x%X\n",
191 ioc->name, le16_to_cpu(pg0->AccessStatus)));
192 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Device Info=0x%X\n",
193 ioc->name, le32_to_cpu(pg0->DeviceInfo)));
194 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Flags=0x%X\n",
195 ioc->name, le16_to_cpu(pg0->Flags)));
196 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n\n",
197 ioc->name, pg0->PhysicalPort));
200 static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
202 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
203 "---- SAS EXPANDER PAGE 1 ------------\n", ioc->name));
204 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n",
205 ioc->name, pg1->PhysicalPort));
206 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Identifier=0x%X\n",
207 ioc->name, pg1->PhyIdentifier));
208 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
209 ioc->name, pg1->NegotiatedLinkRate));
210 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
211 ioc->name, pg1->ProgrammedLinkRate));
212 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hardware Link Rate=0x%X\n",
213 ioc->name, pg1->HwLinkRate));
214 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Owner Device Handle=0x%X\n",
215 ioc->name, le16_to_cpu(pg1->OwnerDevHandle)));
216 dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
217 "Attached Device Handle=0x%X\n\n", ioc->name,
218 le16_to_cpu(pg1->AttachedDevHandle)));
221 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
223 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
224 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
227 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
229 struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
230 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
233 static struct mptsas_portinfo *
234 mptsas_get_hba_portinfo(MPT_ADAPTER *ioc)
236 struct list_head *head = &ioc->sas_topology;
237 struct mptsas_portinfo *pi = NULL;
239 /* always the first entry on sas_topology list */
241 if (!list_empty(head))
242 pi = list_entry(head->next, struct mptsas_portinfo, list);
248 * mptsas_find_portinfo_by_handle
250 * This function should be called with the sas_topology_mutex already held
252 static struct mptsas_portinfo *
253 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
255 struct mptsas_portinfo *port_info, *rc=NULL;
258 list_for_each_entry(port_info, &ioc->sas_topology, list)
259 for (i = 0; i < port_info->num_phys; i++)
260 if (port_info->phy_info[i].identify.handle == handle) {
269 * Returns true if there is a scsi end device
272 mptsas_is_end_device(struct mptsas_devinfo * attached)
274 if ((attached->sas_address) &&
275 (attached->device_info &
276 MPI_SAS_DEVICE_INFO_END_DEVICE) &&
277 ((attached->device_info &
278 MPI_SAS_DEVICE_INFO_SSP_TARGET) |
279 (attached->device_info &
280 MPI_SAS_DEVICE_INFO_STP_TARGET) |
281 (attached->device_info &
282 MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
290 mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details)
292 struct mptsas_portinfo *port_info;
293 struct mptsas_phyinfo *phy_info;
299 port_info = port_details->port_info;
300 phy_info = port_info->phy_info;
302 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d "
303 "bitmask=0x%016llX\n", ioc->name, __func__, port_details,
304 port_details->num_phys, (unsigned long long)
305 port_details->phy_bitmask));
307 for (i = 0; i < port_info->num_phys; i++, phy_info++) {
308 if(phy_info->port_details != port_details)
310 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
311 phy_info->port_details = NULL;
316 static inline struct sas_rphy *
317 mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
319 if (phy_info->port_details)
320 return phy_info->port_details->rphy;
326 mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
328 if (phy_info->port_details) {
329 phy_info->port_details->rphy = rphy;
330 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n",
335 dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
336 &rphy->dev, MYIOC_s_FMT "add:", ioc->name));
337 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n",
338 ioc->name, rphy, rphy->dev.release));
342 static inline struct sas_port *
343 mptsas_get_port(struct mptsas_phyinfo *phy_info)
345 if (phy_info->port_details)
346 return phy_info->port_details->port;
352 mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_port *port)
354 if (phy_info->port_details)
355 phy_info->port_details->port = port;
358 dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
359 &port->dev, MYIOC_s_FMT "add:", ioc->name));
360 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "port=%p release=%p\n",
361 ioc->name, port, port->dev.release));
365 static inline struct scsi_target *
366 mptsas_get_starget(struct mptsas_phyinfo *phy_info)
368 if (phy_info->port_details)
369 return phy_info->port_details->starget;
375 mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target *
378 if (phy_info->port_details)
379 phy_info->port_details->starget = starget;
384 * mptsas_setup_wide_ports
386 * Updates for new and existing narrow/wide port configuration
387 * in the sas_topology
390 mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
392 struct mptsas_portinfo_details * port_details;
393 struct mptsas_phyinfo *phy_info, *phy_info_cmp;
397 mutex_lock(&ioc->sas_topology_mutex);
399 phy_info = port_info->phy_info;
400 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
401 if (phy_info->attached.handle)
403 port_details = phy_info->port_details;
406 if (port_details->num_phys < 2)
409 * Removing a phy from a port, letting the last
410 * phy be removed by firmware events.
412 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
413 "%s: [%p]: deleting phy = %d\n",
414 ioc->name, __func__, port_details, i));
415 port_details->num_phys--;
416 port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
417 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
418 sas_port_delete_phy(port_details->port, phy_info->phy);
419 phy_info->port_details = NULL;
423 * Populate and refresh the tree
425 phy_info = port_info->phy_info;
426 for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
427 sas_address = phy_info->attached.sas_address;
428 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n",
429 ioc->name, i, (unsigned long long)sas_address));
432 port_details = phy_info->port_details;
437 port_details = kzalloc(sizeof(*port_details),
441 port_details->num_phys = 1;
442 port_details->port_info = port_info;
443 if (phy_info->phy_id < 64 )
444 port_details->phy_bitmask |=
445 (1 << phy_info->phy_id);
446 phy_info->sas_port_add_phy=1;
447 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t"
448 "phy_id=%d sas_address=0x%018llX\n",
449 ioc->name, i, (unsigned long long)sas_address));
450 phy_info->port_details = port_details;
453 if (i == port_info->num_phys - 1)
455 phy_info_cmp = &port_info->phy_info[i + 1];
456 for (j = i + 1 ; j < port_info->num_phys ; j++,
458 if (!phy_info_cmp->attached.sas_address)
460 if (sas_address != phy_info_cmp->attached.sas_address)
462 if (phy_info_cmp->port_details == port_details )
464 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
465 "\t\tphy_id=%d sas_address=0x%018llX\n",
466 ioc->name, j, (unsigned long long)
467 phy_info_cmp->attached.sas_address));
468 if (phy_info_cmp->port_details) {
470 mptsas_get_rphy(phy_info_cmp);
472 mptsas_get_port(phy_info_cmp);
473 port_details->starget =
474 mptsas_get_starget(phy_info_cmp);
475 port_details->num_phys =
476 phy_info_cmp->port_details->num_phys;
477 if (!phy_info_cmp->port_details->num_phys)
478 kfree(phy_info_cmp->port_details);
480 phy_info_cmp->sas_port_add_phy=1;
482 * Adding a phy to a port
484 phy_info_cmp->port_details = port_details;
485 if (phy_info_cmp->phy_id < 64 )
486 port_details->phy_bitmask |=
487 (1 << phy_info_cmp->phy_id);
488 port_details->num_phys++;
494 for (i = 0; i < port_info->num_phys; i++) {
495 port_details = port_info->phy_info[i].port_details;
498 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
499 "%s: [%p]: phy_id=%02d num_phys=%02d "
500 "bitmask=0x%016llX\n", ioc->name, __func__,
501 port_details, i, port_details->num_phys,
502 (unsigned long long)port_details->phy_bitmask));
503 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n",
504 ioc->name, port_details->port, port_details->rphy));
506 dsaswideprintk(ioc, printk("\n"));
507 mutex_unlock(&ioc->sas_topology_mutex);
511 * csmisas_find_vtarget
519 mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
521 struct scsi_device *sdev;
523 VirtTarget *vtarget = NULL;
525 shost_for_each_device(sdev, ioc->sh) {
526 if ((vdevice = sdev->hostdata) == NULL)
528 if (vdevice->vtarget->id == id &&
529 vdevice->vtarget->channel == channel)
530 vtarget = vdevice->vtarget;
536 * mptsas_target_reset
538 * Issues TARGET_RESET to end device using handshaking method
544 * Returns (1) success
549 mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
552 SCSITaskMgmt_t *pScsiTm;
554 if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
555 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
556 ioc->name,__func__, __LINE__));
560 /* Format the Request
562 pScsiTm = (SCSITaskMgmt_t *) mf;
563 memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
564 pScsiTm->TargetID = id;
565 pScsiTm->Bus = channel;
566 pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
567 pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
568 pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
570 DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
572 mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf);
578 * mptsas_target_reset_queue
580 * Receive request for TARGET_RESET after recieving an firmware
581 * event NOT_RESPONDING_EVENT, then put command in link list
582 * and queue if task_queue already in use.
589 mptsas_target_reset_queue(MPT_ADAPTER *ioc,
590 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
592 MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
593 VirtTarget *vtarget = NULL;
594 struct mptsas_target_reset_event *target_reset_list;
597 id = sas_event_data->TargetID;
598 channel = sas_event_data->Bus;
600 if (!(vtarget = mptsas_find_vtarget(ioc, channel, id)))
603 vtarget->deleted = 1; /* block IO */
605 target_reset_list = kzalloc(sizeof(*target_reset_list),
607 if (!target_reset_list) {
608 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
609 ioc->name,__func__, __LINE__));
613 memcpy(&target_reset_list->sas_event_data, sas_event_data,
614 sizeof(*sas_event_data));
615 list_add_tail(&target_reset_list->list, &hd->target_reset_list);
617 if (hd->resetPending)
620 if (mptsas_target_reset(ioc, channel, id)) {
621 target_reset_list->target_reset_issued = 1;
622 hd->resetPending = 1;
627 * mptsas_dev_reset_complete
629 * Completion for TARGET_RESET after NOT_RESPONDING_EVENT,
630 * enable work queue to finish off removing device from upper layers.
631 * then send next TARGET_RESET in the queue.
637 mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
639 MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
640 struct list_head *head = &hd->target_reset_list;
641 struct mptsas_target_reset_event *target_reset_list;
642 struct mptsas_hotplug_event *ev;
643 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
647 if (list_empty(head))
650 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, list);
652 sas_event_data = &target_reset_list->sas_event_data;
653 id = sas_event_data->TargetID;
654 channel = sas_event_data->Bus;
655 hd->resetPending = 0;
660 if (!target_reset_list->target_reset_issued) {
661 if (mptsas_target_reset(ioc, channel, id)) {
662 target_reset_list->target_reset_issued = 1;
663 hd->resetPending = 1;
669 * enable work queue to remove device from upper layers
671 list_del(&target_reset_list->list);
673 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
675 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
676 ioc->name,__func__, __LINE__));
680 INIT_WORK(&ev->work, mptsas_hotplug_work);
682 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
684 le16_to_cpu(sas_event_data->ParentDevHandle);
685 ev->channel = channel;
687 ev->phy_id = sas_event_data->PhyNum;
688 memcpy(&sas_address, &sas_event_data->SASAddress,
690 ev->sas_address = le64_to_cpu(sas_address);
691 ev->device_info = le32_to_cpu(sas_event_data->DeviceInfo);
692 ev->event_type = MPTSAS_DEL_DEVICE;
693 schedule_work(&ev->work);
694 kfree(target_reset_list);
697 * issue target reset to next device in the queue
700 head = &hd->target_reset_list;
701 if (list_empty(head))
704 target_reset_list = list_entry(head->next, struct mptsas_target_reset_event,
707 sas_event_data = &target_reset_list->sas_event_data;
708 id = sas_event_data->TargetID;
709 channel = sas_event_data->Bus;
711 if (mptsas_target_reset(ioc, channel, id)) {
712 target_reset_list->target_reset_issued = 1;
713 hd->resetPending = 1;
718 * mptsas_taskmgmt_complete
726 mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
728 mptsas_dev_reset_complete(ioc);
729 return mptscsih_taskmgmt_complete(ioc, mf, mr);
740 mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
743 struct mptsas_target_reset_event *target_reset_list, *n;
746 rc = mptscsih_ioc_reset(ioc, reset_phase);
748 if (ioc->bus_type != SAS)
751 if (reset_phase != MPT_IOC_POST_RESET)
754 if (!ioc->sh || !ioc->sh->hostdata)
756 hd = shost_priv(ioc->sh);
760 if (list_empty(&hd->target_reset_list))
763 /* flush the target_reset_list */
764 list_for_each_entry_safe(target_reset_list, n,
765 &hd->target_reset_list, list) {
766 list_del(&target_reset_list->list);
767 kfree(target_reset_list);
775 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
776 u32 form, u32 form_specific)
778 ConfigExtendedPageHeader_t hdr;
780 SasEnclosurePage0_t *buffer;
781 dma_addr_t dma_handle;
783 __le64 le_identifier;
785 memset(&hdr, 0, sizeof(hdr));
786 hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
788 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
789 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
791 cfg.cfghdr.ehdr = &hdr;
793 cfg.pageAddr = form + form_specific;
794 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
795 cfg.dir = 0; /* read */
798 error = mpt_config(ioc, &cfg);
801 if (!hdr.ExtPageLength) {
806 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
813 cfg.physAddr = dma_handle;
814 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
816 error = mpt_config(ioc, &cfg);
818 goto out_free_consistent;
820 /* save config data */
821 memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
822 enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
823 enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
824 enclosure->flags = le16_to_cpu(buffer->Flags);
825 enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
826 enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
827 enclosure->start_id = buffer->StartTargetID;
828 enclosure->start_channel = buffer->StartBus;
829 enclosure->sep_id = buffer->SEPTargetID;
830 enclosure->sep_channel = buffer->SEPBus;
833 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
840 mptsas_slave_configure(struct scsi_device *sdev)
843 if (sdev->channel == MPTSAS_RAID_CHANNEL)
846 sas_read_port_mode_page(sdev);
849 return mptscsih_slave_configure(sdev);
853 mptsas_target_alloc(struct scsi_target *starget)
855 struct Scsi_Host *host = dev_to_shost(&starget->dev);
856 MPT_SCSI_HOST *hd = shost_priv(host);
859 struct sas_rphy *rphy;
860 struct mptsas_portinfo *p;
862 MPT_ADAPTER *ioc = hd->ioc;
864 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
868 vtarget->starget = starget;
869 vtarget->ioc_id = ioc->id;
870 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
875 * RAID volumes placed beyond the last expected port.
877 if (starget->channel == MPTSAS_RAID_CHANNEL) {
878 for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
879 if (id == ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
880 channel = ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
884 rphy = dev_to_rphy(starget->dev.parent);
885 mutex_lock(&ioc->sas_topology_mutex);
886 list_for_each_entry(p, &ioc->sas_topology, list) {
887 for (i = 0; i < p->num_phys; i++) {
888 if (p->phy_info[i].attached.sas_address !=
889 rphy->identify.sas_address)
891 id = p->phy_info[i].attached.id;
892 channel = p->phy_info[i].attached.channel;
893 mptsas_set_starget(&p->phy_info[i], starget);
896 * Exposing hidden raid components
898 if (mptscsih_is_phys_disk(ioc, channel, id)) {
899 id = mptscsih_raid_id_to_num(ioc,
902 MPT_TARGET_FLAGS_RAID_COMPONENT;
903 p->phy_info[i].attached.phys_disk_num = id;
905 mutex_unlock(&ioc->sas_topology_mutex);
909 mutex_unlock(&ioc->sas_topology_mutex);
916 vtarget->channel = channel;
917 starget->hostdata = vtarget;
922 mptsas_target_destroy(struct scsi_target *starget)
924 struct Scsi_Host *host = dev_to_shost(&starget->dev);
925 MPT_SCSI_HOST *hd = shost_priv(host);
926 struct sas_rphy *rphy;
927 struct mptsas_portinfo *p;
929 MPT_ADAPTER *ioc = hd->ioc;
931 if (!starget->hostdata)
934 if (starget->channel == MPTSAS_RAID_CHANNEL)
937 rphy = dev_to_rphy(starget->dev.parent);
938 list_for_each_entry(p, &ioc->sas_topology, list) {
939 for (i = 0; i < p->num_phys; i++) {
940 if (p->phy_info[i].attached.sas_address !=
941 rphy->identify.sas_address)
943 mptsas_set_starget(&p->phy_info[i], NULL);
949 kfree(starget->hostdata);
950 starget->hostdata = NULL;
955 mptsas_slave_alloc(struct scsi_device *sdev)
957 struct Scsi_Host *host = sdev->host;
958 MPT_SCSI_HOST *hd = shost_priv(host);
959 struct sas_rphy *rphy;
960 struct mptsas_portinfo *p;
962 struct scsi_target *starget;
964 MPT_ADAPTER *ioc = hd->ioc;
966 vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
968 printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
969 ioc->name, sizeof(VirtDevice));
972 starget = scsi_target(sdev);
973 vdevice->vtarget = starget->hostdata;
975 if (sdev->channel == MPTSAS_RAID_CHANNEL)
978 rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
979 mutex_lock(&ioc->sas_topology_mutex);
980 list_for_each_entry(p, &ioc->sas_topology, list) {
981 for (i = 0; i < p->num_phys; i++) {
982 if (p->phy_info[i].attached.sas_address !=
983 rphy->identify.sas_address)
985 vdevice->lun = sdev->lun;
987 * Exposing hidden raid components
989 if (mptscsih_is_phys_disk(ioc,
990 p->phy_info[i].attached.channel,
991 p->phy_info[i].attached.id))
992 sdev->no_uld_attach = 1;
993 mutex_unlock(&ioc->sas_topology_mutex);
997 mutex_unlock(&ioc->sas_topology_mutex);
1003 vdevice->vtarget->num_luns++;
1004 sdev->hostdata = vdevice;
1009 mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1011 VirtDevice *vdevice = SCpnt->device->hostdata;
1013 if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {
1014 SCpnt->result = DID_NO_CONNECT << 16;
1019 // scsi_print_command(SCpnt);
1021 return mptscsih_qcmd(SCpnt,done);
1025 static struct scsi_host_template mptsas_driver_template = {
1026 .module = THIS_MODULE,
1027 .proc_name = "mptsas",
1028 .proc_info = mptscsih_proc_info,
1029 .name = "MPT SPI Host",
1030 .info = mptscsih_info,
1031 .queuecommand = mptsas_qcmd,
1032 .target_alloc = mptsas_target_alloc,
1033 .slave_alloc = mptsas_slave_alloc,
1034 .slave_configure = mptsas_slave_configure,
1035 .target_destroy = mptsas_target_destroy,
1036 .slave_destroy = mptscsih_slave_destroy,
1037 .change_queue_depth = mptscsih_change_queue_depth,
1038 .eh_abort_handler = mptscsih_abort,
1039 .eh_device_reset_handler = mptscsih_dev_reset,
1040 .eh_bus_reset_handler = mptscsih_bus_reset,
1041 .eh_host_reset_handler = mptscsih_host_reset,
1042 .bios_param = mptscsih_bios_param,
1043 .can_queue = MPT_FC_CAN_QUEUE,
1045 .sg_tablesize = MPT_SCSI_SG_DEPTH,
1046 .max_sectors = 8192,
1048 .use_clustering = ENABLE_CLUSTERING,
1049 .shost_attrs = mptscsih_host_attrs,
1052 static int mptsas_get_linkerrors(struct sas_phy *phy)
1054 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1055 ConfigExtendedPageHeader_t hdr;
1057 SasPhyPage1_t *buffer;
1058 dma_addr_t dma_handle;
1061 /* FIXME: only have link errors on local phys */
1062 if (!scsi_is_sas_phy_local(phy))
1065 hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
1066 hdr.ExtPageLength = 0;
1067 hdr.PageNumber = 1 /* page number 1*/;
1070 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1071 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1073 cfg.cfghdr.ehdr = &hdr;
1075 cfg.pageAddr = phy->identify.phy_identifier;
1076 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1077 cfg.dir = 0; /* read */
1080 error = mpt_config(ioc, &cfg);
1083 if (!hdr.ExtPageLength)
1086 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1091 cfg.physAddr = dma_handle;
1092 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1094 error = mpt_config(ioc, &cfg);
1096 goto out_free_consistent;
1098 mptsas_print_phy_pg1(ioc, buffer);
1100 phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
1101 phy->running_disparity_error_count =
1102 le32_to_cpu(buffer->RunningDisparityErrorCount);
1103 phy->loss_of_dword_sync_count =
1104 le32_to_cpu(buffer->LossDwordSynchCount);
1105 phy->phy_reset_problem_count =
1106 le32_to_cpu(buffer->PhyResetProblemCount);
1108 out_free_consistent:
1109 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1110 buffer, dma_handle);
1114 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
1115 MPT_FRAME_HDR *reply)
1117 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
1118 if (reply != NULL) {
1119 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
1120 memcpy(ioc->sas_mgmt.reply, reply,
1121 min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
1123 complete(&ioc->sas_mgmt.done);
1127 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
1129 MPT_ADAPTER *ioc = phy_to_ioc(phy);
1130 SasIoUnitControlRequest_t *req;
1131 SasIoUnitControlReply_t *reply;
1134 unsigned long timeleft;
1135 int error = -ERESTARTSYS;
1137 /* FIXME: fusion doesn't allow non-local phy reset */
1138 if (!scsi_is_sas_phy_local(phy))
1141 /* not implemented for expanders */
1142 if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
1145 if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
1148 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1154 hdr = (MPIHeader_t *) mf;
1155 req = (SasIoUnitControlRequest_t *)mf;
1156 memset(req, 0, sizeof(SasIoUnitControlRequest_t));
1157 req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
1158 req->MsgContext = hdr->MsgContext;
1159 req->Operation = hard_reset ?
1160 MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
1161 req->PhyNum = phy->identify.phy_identifier;
1163 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1165 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
1168 /* On timeout reset the board */
1169 mpt_free_msg_frame(ioc, mf);
1170 mpt_HardResetHandler(ioc, CAN_SLEEP);
1175 /* a reply frame is expected */
1176 if ((ioc->sas_mgmt.status &
1177 MPT_IOCTL_STATUS_RF_VALID) == 0) {
1182 /* process the completed Reply Message Frame */
1183 reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
1184 if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
1185 printk(MYIOC_s_INFO_FMT "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
1186 ioc->name, __func__, reply->IOCStatus, reply->IOCLogInfo);
1194 mutex_unlock(&ioc->sas_mgmt.mutex);
1200 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
1202 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1204 struct mptsas_portinfo *p;
1205 struct mptsas_enclosure enclosure_info;
1206 u64 enclosure_handle;
1208 mutex_lock(&ioc->sas_topology_mutex);
1209 list_for_each_entry(p, &ioc->sas_topology, list) {
1210 for (i = 0; i < p->num_phys; i++) {
1211 if (p->phy_info[i].attached.sas_address ==
1212 rphy->identify.sas_address) {
1213 enclosure_handle = p->phy_info[i].
1214 attached.handle_enclosure;
1219 mutex_unlock(&ioc->sas_topology_mutex);
1223 mutex_unlock(&ioc->sas_topology_mutex);
1224 memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
1225 error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
1226 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
1227 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
1229 *identifier = enclosure_info.enclosure_logical_id;
1234 mptsas_get_bay_identifier(struct sas_rphy *rphy)
1236 MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1237 struct mptsas_portinfo *p;
1240 mutex_lock(&ioc->sas_topology_mutex);
1241 list_for_each_entry(p, &ioc->sas_topology, list) {
1242 for (i = 0; i < p->num_phys; i++) {
1243 if (p->phy_info[i].attached.sas_address ==
1244 rphy->identify.sas_address) {
1245 rc = p->phy_info[i].attached.slot;
1252 mutex_unlock(&ioc->sas_topology_mutex);
1256 static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
1257 struct request *req)
1259 MPT_ADAPTER *ioc = ((MPT_SCSI_HOST *) shost->hostdata)->ioc;
1261 SmpPassthroughRequest_t *smpreq;
1262 struct request *rsp = req->next_rq;
1265 unsigned long timeleft;
1267 dma_addr_t dma_addr_in = 0;
1268 dma_addr_t dma_addr_out = 0;
1269 u64 sas_address = 0;
1272 printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n",
1273 ioc->name, __func__);
1277 /* do we need to support multiple segments? */
1278 if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) {
1279 printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n",
1280 ioc->name, __func__, req->bio->bi_vcnt, req->data_len,
1281 rsp->bio->bi_vcnt, rsp->data_len);
1285 ret = mutex_lock_interruptible(&ioc->sas_mgmt.mutex);
1289 mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1295 smpreq = (SmpPassthroughRequest_t *)mf;
1296 memset(smpreq, 0, sizeof(*smpreq));
1298 smpreq->RequestDataLength = cpu_to_le16(req->data_len - 4);
1299 smpreq->Function = MPI_FUNCTION_SMP_PASSTHROUGH;
1302 sas_address = rphy->identify.sas_address;
1304 struct mptsas_portinfo *port_info;
1306 mutex_lock(&ioc->sas_topology_mutex);
1307 port_info = mptsas_get_hba_portinfo(ioc);
1308 if (port_info && port_info->phy_info)
1310 port_info->phy_info[0].phy->identify.sas_address;
1311 mutex_unlock(&ioc->sas_topology_mutex);
1314 *((u64 *)&smpreq->SASAddress) = cpu_to_le64(sas_address);
1317 (((int *) mf) + (offsetof(SmpPassthroughRequest_t, SGL) / 4));
1320 flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT |
1321 MPI_SGE_FLAGS_END_OF_BUFFER |
1322 MPI_SGE_FLAGS_DIRECTION |
1323 mpt_addr_size()) << MPI_SGE_FLAGS_SHIFT;
1324 flagsLength |= (req->data_len - 4);
1326 dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio),
1327 req->data_len, PCI_DMA_BIDIRECTIONAL);
1330 mpt_add_sge(psge, flagsLength, dma_addr_out);
1331 psge += (sizeof(u32) + sizeof(dma_addr_t));
1334 flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ;
1335 flagsLength |= rsp->data_len + 4;
1336 dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio),
1337 rsp->data_len, PCI_DMA_BIDIRECTIONAL);
1340 mpt_add_sge(psge, flagsLength, dma_addr_in);
1342 mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1344 timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
1346 printk(MYIOC_s_ERR_FMT "%s: smp timeout!\n", ioc->name, __func__);
1347 /* On timeout reset the board */
1348 mpt_HardResetHandler(ioc, CAN_SLEEP);
1354 if (ioc->sas_mgmt.status & MPT_IOCTL_STATUS_RF_VALID) {
1355 SmpPassthroughReply_t *smprep;
1357 smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply;
1358 memcpy(req->sense, smprep, sizeof(*smprep));
1359 req->sense_len = sizeof(*smprep);
1361 rsp->data_len -= smprep->ResponseDataLength;
1363 printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n",
1364 ioc->name, __func__);
1369 pci_unmap_single(ioc->pcidev, dma_addr_out, req->data_len,
1370 PCI_DMA_BIDIRECTIONAL);
1372 pci_unmap_single(ioc->pcidev, dma_addr_in, rsp->data_len,
1373 PCI_DMA_BIDIRECTIONAL);
1376 mpt_free_msg_frame(ioc, mf);
1378 mutex_unlock(&ioc->sas_mgmt.mutex);
1383 static struct sas_function_template mptsas_transport_functions = {
1384 .get_linkerrors = mptsas_get_linkerrors,
1385 .get_enclosure_identifier = mptsas_get_enclosure_identifier,
1386 .get_bay_identifier = mptsas_get_bay_identifier,
1387 .phy_reset = mptsas_phy_reset,
1388 .smp_handler = mptsas_smp_handler,
1391 static struct scsi_transport_template *mptsas_transport_template;
1394 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
1396 ConfigExtendedPageHeader_t hdr;
1398 SasIOUnitPage0_t *buffer;
1399 dma_addr_t dma_handle;
1402 hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
1403 hdr.ExtPageLength = 0;
1407 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1408 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1410 cfg.cfghdr.ehdr = &hdr;
1413 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1414 cfg.dir = 0; /* read */
1417 error = mpt_config(ioc, &cfg);
1420 if (!hdr.ExtPageLength) {
1425 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1432 cfg.physAddr = dma_handle;
1433 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1435 error = mpt_config(ioc, &cfg);
1437 goto out_free_consistent;
1439 port_info->num_phys = buffer->NumPhys;
1440 port_info->phy_info = kcalloc(port_info->num_phys,
1441 sizeof(*port_info->phy_info),GFP_KERNEL);
1442 if (!port_info->phy_info) {
1444 goto out_free_consistent;
1447 ioc->nvdata_version_persistent =
1448 le16_to_cpu(buffer->NvdataVersionPersistent);
1449 ioc->nvdata_version_default =
1450 le16_to_cpu(buffer->NvdataVersionDefault);
1452 for (i = 0; i < port_info->num_phys; i++) {
1453 mptsas_print_phy_data(ioc, &buffer->PhyData[i]);
1454 port_info->phy_info[i].phy_id = i;
1455 port_info->phy_info[i].port_id =
1456 buffer->PhyData[i].Port;
1457 port_info->phy_info[i].negotiated_link_rate =
1458 buffer->PhyData[i].NegotiatedLinkRate;
1459 port_info->phy_info[i].portinfo = port_info;
1460 port_info->phy_info[i].handle =
1461 le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
1464 out_free_consistent:
1465 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1466 buffer, dma_handle);
1472 mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc)
1474 ConfigExtendedPageHeader_t hdr;
1476 SasIOUnitPage1_t *buffer;
1477 dma_addr_t dma_handle;
1479 u16 device_missing_delay;
1481 memset(&hdr, 0, sizeof(ConfigExtendedPageHeader_t));
1482 memset(&cfg, 0, sizeof(CONFIGPARMS));
1484 cfg.cfghdr.ehdr = &hdr;
1485 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1487 cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1488 cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1489 cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION;
1490 cfg.cfghdr.ehdr->PageNumber = 1;
1492 error = mpt_config(ioc, &cfg);
1495 if (!hdr.ExtPageLength) {
1500 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1507 cfg.physAddr = dma_handle;
1508 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1510 error = mpt_config(ioc, &cfg);
1512 goto out_free_consistent;
1514 ioc->io_missing_delay =
1515 le16_to_cpu(buffer->IODeviceMissingDelay);
1516 device_missing_delay = le16_to_cpu(buffer->ReportDeviceMissingDelay);
1517 ioc->device_missing_delay = (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) ?
1518 (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16 :
1519 device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK;
1521 out_free_consistent:
1522 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1523 buffer, dma_handle);
1529 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1530 u32 form, u32 form_specific)
1532 ConfigExtendedPageHeader_t hdr;
1534 SasPhyPage0_t *buffer;
1535 dma_addr_t dma_handle;
1538 hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
1539 hdr.ExtPageLength = 0;
1543 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1544 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1546 cfg.cfghdr.ehdr = &hdr;
1547 cfg.dir = 0; /* read */
1550 /* Get Phy Pg 0 for each Phy. */
1552 cfg.pageAddr = form + form_specific;
1553 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1555 error = mpt_config(ioc, &cfg);
1559 if (!hdr.ExtPageLength) {
1564 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1571 cfg.physAddr = dma_handle;
1572 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1574 error = mpt_config(ioc, &cfg);
1576 goto out_free_consistent;
1578 mptsas_print_phy_pg0(ioc, buffer);
1580 phy_info->hw_link_rate = buffer->HwLinkRate;
1581 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1582 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1583 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1585 out_free_consistent:
1586 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1587 buffer, dma_handle);
1593 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
1594 u32 form, u32 form_specific)
1596 ConfigExtendedPageHeader_t hdr;
1598 SasDevicePage0_t *buffer;
1599 dma_addr_t dma_handle;
1603 if (ioc->sas_discovery_runtime &&
1604 mptsas_is_end_device(device_info))
1607 hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
1608 hdr.ExtPageLength = 0;
1612 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1613 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
1615 cfg.cfghdr.ehdr = &hdr;
1616 cfg.pageAddr = form + form_specific;
1618 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1619 cfg.dir = 0; /* read */
1622 memset(device_info, 0, sizeof(struct mptsas_devinfo));
1623 error = mpt_config(ioc, &cfg);
1626 if (!hdr.ExtPageLength) {
1631 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1638 cfg.physAddr = dma_handle;
1639 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1641 error = mpt_config(ioc, &cfg);
1643 goto out_free_consistent;
1645 mptsas_print_device_pg0(ioc, buffer);
1647 device_info->handle = le16_to_cpu(buffer->DevHandle);
1648 device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
1649 device_info->handle_enclosure =
1650 le16_to_cpu(buffer->EnclosureHandle);
1651 device_info->slot = le16_to_cpu(buffer->Slot);
1652 device_info->phy_id = buffer->PhyNum;
1653 device_info->port_id = buffer->PhysicalPort;
1654 device_info->id = buffer->TargetID;
1655 device_info->phys_disk_num = ~0;
1656 device_info->channel = buffer->Bus;
1657 memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
1658 device_info->sas_address = le64_to_cpu(sas_address);
1659 device_info->device_info =
1660 le32_to_cpu(buffer->DeviceInfo);
1662 out_free_consistent:
1663 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1664 buffer, dma_handle);
1670 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
1671 u32 form, u32 form_specific)
1673 ConfigExtendedPageHeader_t hdr;
1675 SasExpanderPage0_t *buffer;
1676 dma_addr_t dma_handle;
1679 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1680 hdr.ExtPageLength = 0;
1684 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1685 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1687 cfg.cfghdr.ehdr = &hdr;
1689 cfg.pageAddr = form + form_specific;
1690 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1691 cfg.dir = 0; /* read */
1694 memset(port_info, 0, sizeof(struct mptsas_portinfo));
1695 error = mpt_config(ioc, &cfg);
1699 if (!hdr.ExtPageLength) {
1704 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1711 cfg.physAddr = dma_handle;
1712 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1714 error = mpt_config(ioc, &cfg);
1716 goto out_free_consistent;
1718 if (!buffer->NumPhys) {
1720 goto out_free_consistent;
1723 /* save config data */
1724 port_info->num_phys = buffer->NumPhys;
1725 port_info->phy_info = kcalloc(port_info->num_phys,
1726 sizeof(*port_info->phy_info),GFP_KERNEL);
1727 if (!port_info->phy_info) {
1729 goto out_free_consistent;
1732 for (i = 0; i < port_info->num_phys; i++) {
1733 port_info->phy_info[i].portinfo = port_info;
1734 port_info->phy_info[i].handle =
1735 le16_to_cpu(buffer->DevHandle);
1738 out_free_consistent:
1739 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1740 buffer, dma_handle);
1746 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1747 u32 form, u32 form_specific)
1749 ConfigExtendedPageHeader_t hdr;
1751 SasExpanderPage1_t *buffer;
1752 dma_addr_t dma_handle;
1755 if (ioc->sas_discovery_runtime &&
1756 mptsas_is_end_device(&phy_info->attached))
1759 hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1760 hdr.ExtPageLength = 0;
1764 hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1765 hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1767 cfg.cfghdr.ehdr = &hdr;
1769 cfg.pageAddr = form + form_specific;
1770 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1771 cfg.dir = 0; /* read */
1774 error = mpt_config(ioc, &cfg);
1778 if (!hdr.ExtPageLength) {
1783 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1790 cfg.physAddr = dma_handle;
1791 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1793 error = mpt_config(ioc, &cfg);
1795 goto out_free_consistent;
1798 mptsas_print_expander_pg1(ioc, buffer);
1800 /* save config data */
1801 phy_info->phy_id = buffer->PhyIdentifier;
1802 phy_info->port_id = buffer->PhysicalPort;
1803 phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1804 phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1805 phy_info->hw_link_rate = buffer->HwLinkRate;
1806 phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1807 phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1809 out_free_consistent:
1810 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1811 buffer, dma_handle);
1817 mptsas_parse_device_info(struct sas_identify *identify,
1818 struct mptsas_devinfo *device_info)
1822 identify->sas_address = device_info->sas_address;
1823 identify->phy_identifier = device_info->phy_id;
1826 * Fill in Phy Initiator Port Protocol.
1827 * Bits 6:3, more than one bit can be set, fall through cases.
1829 protocols = device_info->device_info & 0x78;
1830 identify->initiator_port_protocols = 0;
1831 if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1832 identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1833 if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1834 identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1835 if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1836 identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1837 if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1838 identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1841 * Fill in Phy Target Port Protocol.
1842 * Bits 10:7, more than one bit can be set, fall through cases.
1844 protocols = device_info->device_info & 0x780;
1845 identify->target_port_protocols = 0;
1846 if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1847 identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1848 if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1849 identify->target_port_protocols |= SAS_PROTOCOL_STP;
1850 if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1851 identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1852 if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1853 identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1856 * Fill in Attached device type.
1858 switch (device_info->device_info &
1859 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1860 case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1861 identify->device_type = SAS_PHY_UNUSED;
1863 case MPI_SAS_DEVICE_INFO_END_DEVICE:
1864 identify->device_type = SAS_END_DEVICE;
1866 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1867 identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1869 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1870 identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1875 static int mptsas_probe_one_phy(struct device *dev,
1876 struct mptsas_phyinfo *phy_info, int index, int local)
1879 struct sas_phy *phy;
1880 struct sas_port *port;
1888 if (!phy_info->phy) {
1889 phy = sas_phy_alloc(dev, index);
1895 phy = phy_info->phy;
1897 mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1900 * Set Negotiated link rate.
1902 switch (phy_info->negotiated_link_rate) {
1903 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1904 phy->negotiated_linkrate = SAS_PHY_DISABLED;
1906 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1907 phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1909 case MPI_SAS_IOUNIT0_RATE_1_5:
1910 phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1912 case MPI_SAS_IOUNIT0_RATE_3_0:
1913 phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1915 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1916 case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1918 phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1923 * Set Max hardware link rate.
1925 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1926 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1927 phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1929 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1930 phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1937 * Set Max programmed link rate.
1939 switch (phy_info->programmed_link_rate &
1940 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1941 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1942 phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1944 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1945 phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1952 * Set Min hardware link rate.
1954 switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1955 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1956 phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1958 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1959 phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1966 * Set Min programmed link rate.
1968 switch (phy_info->programmed_link_rate &
1969 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1970 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1971 phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1973 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1974 phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1980 if (!phy_info->phy) {
1982 error = sas_phy_add(phy);
1987 phy_info->phy = phy;
1990 if (!phy_info->attached.handle ||
1991 !phy_info->port_details)
1994 port = mptsas_get_port(phy_info);
1995 ioc = phy_to_ioc(phy_info->phy);
1997 if (phy_info->sas_port_add_phy) {
2000 port = sas_port_alloc_num(dev);
2005 error = sas_port_add(port);
2007 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2008 "%s: exit at line=%d\n", ioc->name,
2009 __func__, __LINE__));
2012 mptsas_set_port(ioc, phy_info, port);
2013 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
2014 "sas_port_alloc: port=%p dev=%p port_id=%d\n",
2015 ioc->name, port, dev, port->port_identifier));
2017 dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n",
2018 ioc->name, phy_info->phy_id));
2019 sas_port_add_phy(port, phy_info->phy);
2020 phy_info->sas_port_add_phy = 0;
2023 if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
2025 struct sas_rphy *rphy;
2026 struct device *parent;
2027 struct sas_identify identify;
2029 parent = dev->parent->parent;
2031 * Let the hotplug_work thread handle processing
2032 * the adding/removing of devices that occur
2033 * after start of day.
2035 if (ioc->sas_discovery_runtime &&
2036 mptsas_is_end_device(&phy_info->attached))
2039 mptsas_parse_device_info(&identify, &phy_info->attached);
2040 if (scsi_is_host_device(parent)) {
2041 struct mptsas_portinfo *port_info;
2044 mutex_lock(&ioc->sas_topology_mutex);
2045 port_info = mptsas_get_hba_portinfo(ioc);
2046 mutex_unlock(&ioc->sas_topology_mutex);
2048 for (i = 0; i < port_info->num_phys; i++)
2049 if (port_info->phy_info[i].identify.sas_address ==
2050 identify.sas_address) {
2051 sas_port_mark_backlink(port);
2055 } else if (scsi_is_sas_rphy(parent)) {
2056 struct sas_rphy *parent_rphy = dev_to_rphy(parent);
2057 if (identify.sas_address ==
2058 parent_rphy->identify.sas_address) {
2059 sas_port_mark_backlink(port);
2064 switch (identify.device_type) {
2065 case SAS_END_DEVICE:
2066 rphy = sas_end_device_alloc(port);
2068 case SAS_EDGE_EXPANDER_DEVICE:
2069 case SAS_FANOUT_EXPANDER_DEVICE:
2070 rphy = sas_expander_alloc(port, identify.device_type);
2077 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2078 "%s: exit at line=%d\n", ioc->name,
2079 __func__, __LINE__));
2083 rphy->identify = identify;
2084 error = sas_rphy_add(rphy);
2086 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2087 "%s: exit at line=%d\n", ioc->name,
2088 __func__, __LINE__));
2089 sas_rphy_free(rphy);
2092 mptsas_set_rphy(ioc, phy_info, rphy);
2100 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
2102 struct mptsas_portinfo *port_info, *hba;
2103 int error = -ENOMEM, i;
2105 hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
2109 error = mptsas_sas_io_unit_pg0(ioc, hba);
2111 goto out_free_port_info;
2113 mptsas_sas_io_unit_pg1(ioc);
2114 mutex_lock(&ioc->sas_topology_mutex);
2115 port_info = mptsas_get_hba_portinfo(ioc);
2118 list_add_tail(&port_info->list, &ioc->sas_topology);
2120 for (i = 0; i < hba->num_phys; i++) {
2121 port_info->phy_info[i].negotiated_link_rate =
2122 hba->phy_info[i].negotiated_link_rate;
2123 port_info->phy_info[i].handle =
2124 hba->phy_info[i].handle;
2125 port_info->phy_info[i].port_id =
2126 hba->phy_info[i].port_id;
2128 kfree(hba->phy_info);
2132 mutex_unlock(&ioc->sas_topology_mutex);
2133 for (i = 0; i < port_info->num_phys; i++) {
2134 mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
2135 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
2136 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
2138 mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
2139 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2140 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2141 port_info->phy_info[i].handle);
2142 port_info->phy_info[i].identify.phy_id =
2143 port_info->phy_info[i].phy_id = i;
2144 if (port_info->phy_info[i].attached.handle)
2145 mptsas_sas_device_pg0(ioc,
2146 &port_info->phy_info[i].attached,
2147 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2148 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2149 port_info->phy_info[i].attached.handle);
2152 mptsas_setup_wide_ports(ioc, port_info);
2154 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2155 mptsas_probe_one_phy(&ioc->sh->shost_gendev,
2156 &port_info->phy_info[i], ioc->sas_index, 1);
2167 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
2169 struct mptsas_portinfo *port_info, *p, *ex;
2170 struct device *parent;
2171 struct sas_rphy *rphy;
2172 int error = -ENOMEM, i, j;
2174 ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
2178 error = mptsas_sas_expander_pg0(ioc, ex,
2179 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
2180 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
2182 goto out_free_port_info;
2184 *handle = ex->phy_info[0].handle;
2186 mutex_lock(&ioc->sas_topology_mutex);
2187 port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
2190 list_add_tail(&port_info->list, &ioc->sas_topology);
2192 for (i = 0; i < ex->num_phys; i++) {
2193 port_info->phy_info[i].handle =
2194 ex->phy_info[i].handle;
2195 port_info->phy_info[i].port_id =
2196 ex->phy_info[i].port_id;
2198 kfree(ex->phy_info);
2202 mutex_unlock(&ioc->sas_topology_mutex);
2204 for (i = 0; i < port_info->num_phys; i++) {
2205 mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
2206 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
2207 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
2209 if (port_info->phy_info[i].identify.handle) {
2210 mptsas_sas_device_pg0(ioc,
2211 &port_info->phy_info[i].identify,
2212 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2213 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2214 port_info->phy_info[i].identify.handle);
2215 port_info->phy_info[i].identify.phy_id =
2216 port_info->phy_info[i].phy_id;
2219 if (port_info->phy_info[i].attached.handle) {
2220 mptsas_sas_device_pg0(ioc,
2221 &port_info->phy_info[i].attached,
2222 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2223 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2224 port_info->phy_info[i].attached.handle);
2225 port_info->phy_info[i].attached.phy_id =
2226 port_info->phy_info[i].phy_id;
2230 parent = &ioc->sh->shost_gendev;
2231 for (i = 0; i < port_info->num_phys; i++) {
2232 mutex_lock(&ioc->sas_topology_mutex);
2233 list_for_each_entry(p, &ioc->sas_topology, list) {
2234 for (j = 0; j < p->num_phys; j++) {
2235 if (port_info->phy_info[i].identify.handle !=
2236 p->phy_info[j].attached.handle)
2238 rphy = mptsas_get_rphy(&p->phy_info[j]);
2239 parent = &rphy->dev;
2242 mutex_unlock(&ioc->sas_topology_mutex);
2245 mptsas_setup_wide_ports(ioc, port_info);
2247 for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2248 mptsas_probe_one_phy(parent, &port_info->phy_info[i],
2255 kfree(ex->phy_info);
2263 * mptsas_delete_expander_phys
2266 * This will traverse topology, and remove expanders
2267 * that are no longer present
2270 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
2272 struct mptsas_portinfo buffer;
2273 struct mptsas_portinfo *port_info, *n, *parent;
2274 struct mptsas_phyinfo *phy_info;
2275 struct sas_port * port;
2277 u64 expander_sas_address;
2279 mutex_lock(&ioc->sas_topology_mutex);
2280 list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
2282 if (!(port_info->phy_info[0].identify.device_info &
2283 MPI_SAS_DEVICE_INFO_SMP_TARGET))
2286 if (mptsas_sas_expander_pg0(ioc, &buffer,
2287 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
2288 MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
2289 port_info->phy_info[0].handle)) {
2292 * Obtain the port_info instance to the parent port
2294 parent = mptsas_find_portinfo_by_handle(ioc,
2295 port_info->phy_info[0].identify.handle_parent);
2300 expander_sas_address =
2301 port_info->phy_info[0].identify.sas_address;
2304 * Delete rphys in the parent that point
2305 * to this expander. The transport layer will
2306 * cleanup all the children.
2308 phy_info = parent->phy_info;
2309 for (i = 0; i < parent->num_phys; i++, phy_info++) {
2310 port = mptsas_get_port(phy_info);
2313 if (phy_info->attached.sas_address !=
2314 expander_sas_address)
2317 dev_printk(KERN_DEBUG, &port->dev,
2318 MYIOC_s_FMT "delete port (%d)\n", ioc->name,
2319 port->port_identifier));
2320 sas_port_delete(port);
2321 mptsas_port_delete(ioc, phy_info->port_details);
2325 phy_info = port_info->phy_info;
2326 for (i = 0; i < port_info->num_phys; i++, phy_info++)
2327 mptsas_port_delete(ioc, phy_info->port_details);
2329 list_del(&port_info->list);
2330 kfree(port_info->phy_info);
2334 * Free this memory allocated from inside
2335 * mptsas_sas_expander_pg0
2337 kfree(buffer.phy_info);
2339 mutex_unlock(&ioc->sas_topology_mutex);
2343 * Start of day discovery
2346 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
2348 u32 handle = 0xFFFF;
2351 mutex_lock(&ioc->sas_discovery_mutex);
2352 mptsas_probe_hba_phys(ioc);
2353 while (!mptsas_probe_expander_phys(ioc, &handle))
2356 Reporting RAID volumes.
2358 if (!ioc->ir_firmware)
2360 if (!ioc->raid_data.pIocPg2)
2362 if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
2364 for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
2365 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
2366 ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
2369 mutex_unlock(&ioc->sas_discovery_mutex);
2373 * Work queue thread to handle Runtime discovery
2374 * Mere purpose is the hot add/delete of expanders
2378 __mptsas_discovery_work(MPT_ADAPTER *ioc)
2380 u32 handle = 0xFFFF;
2382 ioc->sas_discovery_runtime=1;
2383 mptsas_delete_expander_phys(ioc);
2384 mptsas_probe_hba_phys(ioc);
2385 while (!mptsas_probe_expander_phys(ioc, &handle))
2387 ioc->sas_discovery_runtime=0;
2391 * Work queue thread to handle Runtime discovery
2392 * Mere purpose is the hot add/delete of expanders
2396 mptsas_discovery_work(struct work_struct *work)
2398 struct mptsas_discovery_event *ev =
2399 container_of(work, struct mptsas_discovery_event, work);
2400 MPT_ADAPTER *ioc = ev->ioc;
2402 mutex_lock(&ioc->sas_discovery_mutex);
2403 __mptsas_discovery_work(ioc);
2404 mutex_unlock(&ioc->sas_discovery_mutex);
2408 static struct mptsas_phyinfo *
2409 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
2411 struct mptsas_portinfo *port_info;
2412 struct mptsas_phyinfo *phy_info = NULL;
2415 mutex_lock(&ioc->sas_topology_mutex);
2416 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2417 for (i = 0; i < port_info->num_phys; i++) {
2418 if (!mptsas_is_end_device(
2419 &port_info->phy_info[i].attached))
2421 if (port_info->phy_info[i].attached.sas_address
2424 phy_info = &port_info->phy_info[i];
2428 mutex_unlock(&ioc->sas_topology_mutex);
2432 static struct mptsas_phyinfo *
2433 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
2435 struct mptsas_portinfo *port_info;
2436 struct mptsas_phyinfo *phy_info = NULL;
2439 mutex_lock(&ioc->sas_topology_mutex);
2440 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2441 for (i = 0; i < port_info->num_phys; i++) {
2442 if (!mptsas_is_end_device(
2443 &port_info->phy_info[i].attached))
2445 if (port_info->phy_info[i].attached.id != id)
2447 if (port_info->phy_info[i].attached.channel != channel)
2449 phy_info = &port_info->phy_info[i];
2453 mutex_unlock(&ioc->sas_topology_mutex);
2457 static struct mptsas_phyinfo *
2458 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
2460 struct mptsas_portinfo *port_info;
2461 struct mptsas_phyinfo *phy_info = NULL;
2464 mutex_lock(&ioc->sas_topology_mutex);
2465 list_for_each_entry(port_info, &ioc->sas_topology, list) {
2466 for (i = 0; i < port_info->num_phys; i++) {
2467 if (!mptsas_is_end_device(
2468 &port_info->phy_info[i].attached))
2470 if (port_info->phy_info[i].attached.phys_disk_num == ~0)
2472 if (port_info->phy_info[i].attached.phys_disk_num != id)
2474 if (port_info->phy_info[i].attached.channel != channel)
2476 phy_info = &port_info->phy_info[i];
2480 mutex_unlock(&ioc->sas_topology_mutex);
2485 * Work queue thread to clear the persitency table
2488 mptsas_persist_clear_table(struct work_struct *work)
2490 MPT_ADAPTER *ioc = container_of(work, MPT_ADAPTER, sas_persist_task);
2492 mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
2496 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
2500 sdev->no_uld_attach = data ? 1 : 0;
2501 rc = scsi_device_reprobe(sdev);
2505 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
2507 starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
2508 mptsas_reprobe_lun);
2512 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
2515 ConfigPageHeader_t hdr;
2516 dma_addr_t dma_handle;
2517 pRaidVolumePage0_t buffer = NULL;
2518 RaidPhysDiskPage0_t phys_disk;
2520 struct mptsas_hotplug_event *ev;
2522 memset(&cfg, 0 , sizeof(CONFIGPARMS));
2523 memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
2524 hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
2525 cfg.pageAddr = (channel << 8) + id;
2526 cfg.cfghdr.hdr = &hdr;
2527 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2529 if (mpt_config(ioc, &cfg) != 0)
2532 if (!hdr.PageLength)
2535 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
2541 cfg.physAddr = dma_handle;
2542 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2544 if (mpt_config(ioc, &cfg) != 0)
2547 if (!(buffer->VolumeStatus.Flags &
2548 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
2551 if (!buffer->NumPhysDisks)
2554 for (i = 0; i < buffer->NumPhysDisks; i++) {
2556 if (mpt_raid_phys_disk_pg0(ioc,
2557 buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
2560 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2562 printk(MYIOC_s_WARN_FMT "mptsas: lost hotplug event\n", ioc->name);
2566 INIT_WORK(&ev->work, mptsas_hotplug_work);
2568 ev->id = phys_disk.PhysDiskID;
2569 ev->channel = phys_disk.PhysDiskBus;
2570 ev->phys_disk_num_valid = 1;
2571 ev->phys_disk_num = phys_disk.PhysDiskNum;
2572 ev->event_type = MPTSAS_ADD_DEVICE;
2573 schedule_work(&ev->work);
2578 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
2582 * Work queue thread to handle SAS hotplug events
2585 mptsas_hotplug_work(struct work_struct *work)
2587 struct mptsas_hotplug_event *ev =
2588 container_of(work, struct mptsas_hotplug_event, work);
2590 MPT_ADAPTER *ioc = ev->ioc;
2591 struct mptsas_phyinfo *phy_info;
2592 struct sas_rphy *rphy;
2593 struct sas_port *port;
2594 struct scsi_device *sdev;
2595 struct scsi_target * starget;
2596 struct sas_identify identify;
2598 struct mptsas_devinfo sas_device;
2599 VirtTarget *vtarget;
2600 VirtDevice *vdevice;
2602 mutex_lock(&ioc->sas_discovery_mutex);
2603 switch (ev->event_type) {
2604 case MPTSAS_DEL_DEVICE:
2607 if (ev->phys_disk_num_valid) {
2608 if (ev->hidden_raid_component){
2609 if (mptsas_sas_device_pg0(ioc, &sas_device,
2610 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2611 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2612 (ev->channel << 8) + ev->id)) {
2613 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2614 "%s: exit at line=%d\n", ioc->name,
2615 __func__, __LINE__));
2618 phy_info = mptsas_find_phyinfo_by_sas_address(
2619 ioc, sas_device.sas_address);
2621 phy_info = mptsas_find_phyinfo_by_phys_disk_num(
2622 ioc, ev->channel, ev->phys_disk_num);
2626 phy_info = mptsas_find_phyinfo_by_target(ioc,
2627 ev->channel, ev->id);
2630 * Sanity checks, for non-existing phys and remote rphys.
2633 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2634 "%s: exit at line=%d\n", ioc->name,
2635 __func__, __LINE__));
2638 if (!phy_info->port_details) {
2639 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2640 "%s: exit at line=%d\n", ioc->name,
2641 __func__, __LINE__));
2644 rphy = mptsas_get_rphy(phy_info);
2646 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2647 "%s: exit at line=%d\n", ioc->name,
2648 __func__, __LINE__));
2652 port = mptsas_get_port(phy_info);
2654 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2655 "%s: exit at line=%d\n", ioc->name,
2656 __func__, __LINE__));
2660 starget = mptsas_get_starget(phy_info);
2662 vtarget = starget->hostdata;
2665 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2666 "%s: exit at line=%d\n", ioc->name,
2667 __func__, __LINE__));
2672 * Handling RAID components
2674 if (ev->phys_disk_num_valid &&
2675 ev->hidden_raid_component) {
2676 printk(MYIOC_s_INFO_FMT
2677 "RAID Hidding: channel=%d, id=%d, "
2678 "physdsk %d \n", ioc->name, ev->channel,
2679 ev->id, ev->phys_disk_num);
2680 vtarget->id = ev->phys_disk_num;
2682 MPT_TARGET_FLAGS_RAID_COMPONENT;
2683 mptsas_reprobe_target(starget, 1);
2684 phy_info->attached.phys_disk_num =
2690 if (phy_info->attached.device_info &
2691 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2693 if (phy_info->attached.device_info &
2694 MPI_SAS_DEVICE_INFO_STP_TARGET)
2696 if (phy_info->attached.device_info &
2697 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2700 printk(MYIOC_s_INFO_FMT
2701 "removing %s device, channel %d, id %d, phy %d\n",
2702 ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
2703 dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT
2704 "delete port (%d)\n", ioc->name, port->port_identifier);
2705 sas_port_delete(port);
2706 mptsas_port_delete(ioc, phy_info->port_details);
2708 case MPTSAS_ADD_DEVICE:
2710 if (ev->phys_disk_num_valid)
2711 mpt_findImVolumes(ioc);
2714 * Refresh sas device pg0 data
2716 if (mptsas_sas_device_pg0(ioc, &sas_device,
2717 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2718 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2719 (ev->channel << 8) + ev->id)) {
2720 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2721 "%s: exit at line=%d\n", ioc->name,
2722 __func__, __LINE__));
2726 __mptsas_discovery_work(ioc);
2728 phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
2729 sas_device.sas_address);
2731 if (!phy_info || !phy_info->port_details) {
2732 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2733 "%s: exit at line=%d\n", ioc->name,
2734 __func__, __LINE__));
2738 starget = mptsas_get_starget(phy_info);
2739 if (starget && (!ev->hidden_raid_component)){
2741 vtarget = starget->hostdata;
2744 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2745 "%s: exit at line=%d\n", ioc->name,
2746 __func__, __LINE__));
2750 * Handling RAID components
2752 if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2753 printk(MYIOC_s_INFO_FMT
2754 "RAID Exposing: channel=%d, id=%d, "
2755 "physdsk %d \n", ioc->name, ev->channel,
2756 ev->id, ev->phys_disk_num);
2758 ~MPT_TARGET_FLAGS_RAID_COMPONENT;
2759 vtarget->id = ev->id;
2760 mptsas_reprobe_target(starget, 0);
2761 phy_info->attached.phys_disk_num = ~0;
2766 if (mptsas_get_rphy(phy_info)) {
2767 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2768 "%s: exit at line=%d\n", ioc->name,
2769 __func__, __LINE__));
2770 if (ev->channel) printk("%d\n", __LINE__);
2774 port = mptsas_get_port(phy_info);
2776 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2777 "%s: exit at line=%d\n", ioc->name,
2778 __func__, __LINE__));
2781 memcpy(&phy_info->attached, &sas_device,
2782 sizeof(struct mptsas_devinfo));
2784 if (phy_info->attached.device_info &
2785 MPI_SAS_DEVICE_INFO_SSP_TARGET)
2787 if (phy_info->attached.device_info &
2788 MPI_SAS_DEVICE_INFO_STP_TARGET)
2790 if (phy_info->attached.device_info &
2791 MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2794 printk(MYIOC_s_INFO_FMT
2795 "attaching %s device, channel %d, id %d, phy %d\n",
2796 ioc->name, ds, ev->channel, ev->id, ev->phy_id);
2798 mptsas_parse_device_info(&identify, &phy_info->attached);
2799 rphy = sas_end_device_alloc(port);
2801 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2802 "%s: exit at line=%d\n", ioc->name,
2803 __func__, __LINE__));
2804 break; /* non-fatal: an rphy can be added later */
2807 rphy->identify = identify;
2808 if (sas_rphy_add(rphy)) {
2809 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2810 "%s: exit at line=%d\n", ioc->name,
2811 __func__, __LINE__));
2812 sas_rphy_free(rphy);
2815 mptsas_set_rphy(ioc, phy_info, rphy);
2817 case MPTSAS_ADD_RAID:
2818 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2821 scsi_device_put(sdev);
2824 printk(MYIOC_s_INFO_FMT
2825 "attaching raid volume, channel %d, id %d\n",
2826 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2827 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
2828 mpt_findImVolumes(ioc);
2830 case MPTSAS_DEL_RAID:
2831 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2835 printk(MYIOC_s_INFO_FMT
2836 "removing raid volume, channel %d, id %d\n",
2837 ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2838 vdevice = sdev->hostdata;
2839 scsi_remove_device(sdev);
2840 scsi_device_put(sdev);
2841 mpt_findImVolumes(ioc);
2843 case MPTSAS_ADD_INACTIVE_VOLUME:
2844 mptsas_adding_inactive_raid_components(ioc,
2845 ev->channel, ev->id);
2847 case MPTSAS_IGNORE_EVENT:
2852 mutex_unlock(&ioc->sas_discovery_mutex);
2857 mptsas_send_sas_event(MPT_ADAPTER *ioc,
2858 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
2860 struct mptsas_hotplug_event *ev;
2861 u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
2865 (MPI_SAS_DEVICE_INFO_SSP_TARGET |
2866 MPI_SAS_DEVICE_INFO_STP_TARGET |
2867 MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
2870 switch (sas_event_data->ReasonCode) {
2871 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
2873 mptsas_target_reset_queue(ioc, sas_event_data);
2876 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
2877 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2879 printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
2883 INIT_WORK(&ev->work, mptsas_hotplug_work);
2885 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
2887 le16_to_cpu(sas_event_data->ParentDevHandle);
2888 ev->channel = sas_event_data->Bus;
2889 ev->id = sas_event_data->TargetID;
2890 ev->phy_id = sas_event_data->PhyNum;
2891 memcpy(&sas_address, &sas_event_data->SASAddress,
2893 ev->sas_address = le64_to_cpu(sas_address);
2894 ev->device_info = device_info;
2896 if (sas_event_data->ReasonCode &
2897 MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
2898 ev->event_type = MPTSAS_ADD_DEVICE;
2900 ev->event_type = MPTSAS_DEL_DEVICE;
2901 schedule_work(&ev->work);
2903 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
2905 * Persistent table is full.
2907 INIT_WORK(&ioc->sas_persist_task,
2908 mptsas_persist_clear_table);
2909 schedule_work(&ioc->sas_persist_task);
2912 * TODO, handle other events
2914 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
2915 case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
2916 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
2917 case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
2918 case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
2919 case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
2920 case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
2926 mptsas_send_raid_event(MPT_ADAPTER *ioc,
2927 EVENT_DATA_RAID *raid_event_data)
2929 struct mptsas_hotplug_event *ev;
2930 int status = le32_to_cpu(raid_event_data->SettingsStatus);
2931 int state = (status >> 8) & 0xff;
2933 if (ioc->bus_type != SAS)
2936 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2938 printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);
2942 INIT_WORK(&ev->work, mptsas_hotplug_work);
2944 ev->id = raid_event_data->VolumeID;
2945 ev->channel = raid_event_data->VolumeBus;
2946 ev->event_type = MPTSAS_IGNORE_EVENT;
2948 switch (raid_event_data->ReasonCode) {
2949 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
2950 ev->phys_disk_num_valid = 1;
2951 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2952 ev->event_type = MPTSAS_ADD_DEVICE;
2954 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
2955 ev->phys_disk_num_valid = 1;
2956 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2957 ev->hidden_raid_component = 1;
2958 ev->event_type = MPTSAS_DEL_DEVICE;
2960 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
2962 case MPI_PD_STATE_ONLINE:
2963 case MPI_PD_STATE_NOT_COMPATIBLE:
2964 ev->phys_disk_num_valid = 1;
2965 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2966 ev->hidden_raid_component = 1;
2967 ev->event_type = MPTSAS_ADD_DEVICE;
2969 case MPI_PD_STATE_MISSING:
2970 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
2971 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
2972 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
2973 ev->phys_disk_num_valid = 1;
2974 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2975 ev->event_type = MPTSAS_DEL_DEVICE;
2981 case MPI_EVENT_RAID_RC_VOLUME_DELETED:
2982 ev->event_type = MPTSAS_DEL_RAID;
2984 case MPI_EVENT_RAID_RC_VOLUME_CREATED:
2985 ev->event_type = MPTSAS_ADD_RAID;
2987 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
2989 case MPI_RAIDVOL0_STATUS_STATE_FAILED:
2990 case MPI_RAIDVOL0_STATUS_STATE_MISSING:
2991 ev->event_type = MPTSAS_DEL_RAID;
2993 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
2994 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
2995 ev->event_type = MPTSAS_ADD_RAID;
3004 schedule_work(&ev->work);
3008 mptsas_send_discovery_event(MPT_ADAPTER *ioc,
3009 EVENT_DATA_SAS_DISCOVERY *discovery_data)
3011 struct mptsas_discovery_event *ev;
3016 * This flag will be non-zero when firmware
3017 * kicks off discovery, and return to zero
3018 * once its completed.
3020 if (discovery_data->DiscoveryStatus)
3023 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
3026 INIT_WORK(&ev->work, mptsas_discovery_work);
3028 schedule_work(&ev->work);
3032 * mptsas_send_ir2_event - handle exposing hidden disk when
3033 * an inactive raid volume is added
3035 * @ioc: Pointer to MPT_ADAPTER structure
3040 mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
3042 struct mptsas_hotplug_event *ev;
3044 if (ir2_data->ReasonCode !=
3045 MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
3048 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
3052 INIT_WORK(&ev->work, mptsas_hotplug_work);
3054 ev->id = ir2_data->TargetID;
3055 ev->channel = ir2_data->Bus;
3056 ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
3058 schedule_work(&ev->work);
3062 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
3065 u8 event = le32_to_cpu(reply->Event) & 0xFF;
3071 * sas_discovery_ignore_events
3073 * This flag is to prevent anymore processing of
3074 * sas events once mptsas_remove function is called.
3076 if (ioc->sas_discovery_ignore_events) {
3077 rc = mptscsih_event_process(ioc, reply);
3082 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
3083 mptsas_send_sas_event(ioc,
3084 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
3086 case MPI_EVENT_INTEGRATED_RAID:
3087 mptsas_send_raid_event(ioc,
3088 (EVENT_DATA_RAID *)reply->Data);
3090 case MPI_EVENT_PERSISTENT_TABLE_FULL:
3091 INIT_WORK(&ioc->sas_persist_task,
3092 mptsas_persist_clear_table);
3093 schedule_work(&ioc->sas_persist_task);
3095 case MPI_EVENT_SAS_DISCOVERY:
3096 mptsas_send_discovery_event(ioc,
3097 (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
3100 mptsas_send_ir2_event(ioc,
3101 (PTR_MPI_EVENT_DATA_IR2)reply->Data);
3104 rc = mptscsih_event_process(ioc, reply);
3113 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
3115 struct Scsi_Host *sh;
3118 unsigned long flags;
3126 r = mpt_attach(pdev,id);
3130 ioc = pci_get_drvdata(pdev);
3131 ioc->DoneCtx = mptsasDoneCtx;
3132 ioc->TaskCtx = mptsasTaskCtx;
3133 ioc->InternalCtx = mptsasInternalCtx;
3135 /* Added sanity check on readiness of the MPT adapter.
3137 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
3138 printk(MYIOC_s_WARN_FMT
3139 "Skipping because it's not operational!\n",
3142 goto out_mptsas_probe;
3146 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
3149 goto out_mptsas_probe;
3152 /* Sanity check - ensure at least 1 port is INITIATOR capable
3155 for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
3156 if (ioc->pfacts[ii].ProtocolFlags &
3157 MPI_PORTFACTS_PROTOCOL_INITIATOR)
3162 printk(MYIOC_s_WARN_FMT
3163 "Skipping ioc=%p because SCSI Initiator mode "
3164 "is NOT enabled!\n", ioc->name, ioc);
3168 sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
3170 printk(MYIOC_s_WARN_FMT
3171 "Unable to register controller with SCSI subsystem\n",
3174 goto out_mptsas_probe;
3177 spin_lock_irqsave(&ioc->FreeQlock, flags);
3179 /* Attach the SCSI Host to the IOC structure
3187 /* set 16 byte cdb's */
3188 sh->max_cmd_len = 16;
3190 sh->max_id = ioc->pfacts[0].PortSCSIID;
3191 sh->max_lun = max_lun;
3193 sh->transportt = mptsas_transport_template;
3197 sh->unique_id = ioc->id;
3199 INIT_LIST_HEAD(&ioc->sas_topology);
3200 mutex_init(&ioc->sas_topology_mutex);
3201 mutex_init(&ioc->sas_discovery_mutex);
3202 mutex_init(&ioc->sas_mgmt.mutex);
3203 init_completion(&ioc->sas_mgmt.done);
3205 /* Verify that we won't exceed the maximum
3206 * number of chain buffers
3207 * We can optimize: ZZ = req_sz/sizeof(SGE)
3209 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
3210 * + (req_sz - 64)/sizeof(SGE)
3211 * A slightly different algorithm is required for
3214 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
3215 if (sizeof(dma_addr_t) == sizeof(u64)) {
3216 numSGE = (scale - 1) *
3217 (ioc->facts.MaxChainDepth-1) + scale +
3218 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
3221 numSGE = 1 + (scale - 1) *
3222 (ioc->facts.MaxChainDepth-1) + scale +
3223 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
3227 if (numSGE < sh->sg_tablesize) {
3228 /* Reset this value */
3229 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3230 "Resetting sg_tablesize to %d from %d\n",
3231 ioc->name, numSGE, sh->sg_tablesize));
3232 sh->sg_tablesize = numSGE;
3235 hd = shost_priv(sh);
3238 /* SCSI needs scsi_cmnd lookup table!
3239 * (with size equal to req_depth*PtrSz!)
3241 ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
3242 if (!ioc->ScsiLookup) {
3244 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3245 goto out_mptsas_probe;
3247 spin_lock_init(&ioc->scsi_lookup_lock);
3249 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
3250 ioc->name, ioc->ScsiLookup));
3252 /* Clear the TM flags
3255 hd->tmState = TM_STATE_NONE;
3256 hd->resetPending = 0;
3257 hd->abortSCpnt = NULL;
3259 /* Clear the pointer used to store
3260 * single-threaded commands, i.e., those
3261 * issued during a bus scan, dv and
3262 * configuration pages.
3266 /* Initialize this SCSI Hosts' timers
3267 * To use, set the timer expires field
3270 init_timer(&hd->timer);
3271 hd->timer.data = (unsigned long) hd;
3272 hd->timer.function = mptscsih_timer_expired;
3274 ioc->sas_data.ptClear = mpt_pt_clear;
3276 init_waitqueue_head(&hd->scandv_waitq);
3277 hd->scandv_wait_done = 0;
3278 hd->last_queue_full = 0;
3279 INIT_LIST_HEAD(&hd->target_reset_list);
3280 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3282 if (ioc->sas_data.ptClear==1) {
3283 mptbase_sas_persist_operation(
3284 ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
3287 error = scsi_add_host(sh, &ioc->pcidev->dev);
3289 dprintk(ioc, printk(MYIOC_s_ERR_FMT
3290 "scsi_add_host failed\n", ioc->name));
3291 goto out_mptsas_probe;
3294 mptsas_scan_sas_topology(ioc);
3300 mptscsih_remove(pdev);
3304 static void __devexit mptsas_remove(struct pci_dev *pdev)
3306 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
3307 struct mptsas_portinfo *p, *n;
3310 ioc->sas_discovery_ignore_events = 1;
3311 sas_remove_host(ioc->sh);
3313 mutex_lock(&ioc->sas_topology_mutex);
3314 list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
3316 for (i = 0 ; i < p->num_phys ; i++)
3317 mptsas_port_delete(ioc, p->phy_info[i].port_details);
3321 mutex_unlock(&ioc->sas_topology_mutex);
3323 mptscsih_remove(pdev);
3326 static struct pci_device_id mptsas_pci_table[] = {
3327 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
3328 PCI_ANY_ID, PCI_ANY_ID },
3329 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
3330 PCI_ANY_ID, PCI_ANY_ID },
3331 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
3332 PCI_ANY_ID, PCI_ANY_ID },
3333 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
3334 PCI_ANY_ID, PCI_ANY_ID },
3335 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
3336 PCI_ANY_ID, PCI_ANY_ID },
3337 {0} /* Terminating entry */
3339 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
3342 static struct pci_driver mptsas_driver = {
3344 .id_table = mptsas_pci_table,
3345 .probe = mptsas_probe,
3346 .remove = __devexit_p(mptsas_remove),
3347 .shutdown = mptscsih_shutdown,
3349 .suspend = mptscsih_suspend,
3350 .resume = mptscsih_resume,
3359 show_mptmod_ver(my_NAME, my_VERSION);
3361 mptsas_transport_template =
3362 sas_attach_transport(&mptsas_transport_functions);
3363 if (!mptsas_transport_template)
3366 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
3367 mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
3369 mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
3370 mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
3372 mpt_event_register(mptsasDoneCtx, mptsas_event_process);
3373 mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset);
3375 error = pci_register_driver(&mptsas_driver);
3377 sas_release_transport(mptsas_transport_template);
3385 pci_unregister_driver(&mptsas_driver);
3386 sas_release_transport(mptsas_transport_template);
3388 mpt_reset_deregister(mptsasDoneCtx);
3389 mpt_event_deregister(mptsasDoneCtx);
3391 mpt_deregister(mptsasMgmtCtx);
3392 mpt_deregister(mptsasInternalCtx);
3393 mpt_deregister(mptsasTaskCtx);
3394 mpt_deregister(mptsasDoneCtx);
3397 module_init(mptsas_init);
3398 module_exit(mptsas_exit);