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/slab.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 #define SAS_CONFIG_PAGE_TIMEOUT 30
77 MODULE_AUTHOR(MODULEAUTHOR
);
78 MODULE_DESCRIPTION(my_NAME
);
79 MODULE_LICENSE("GPL");
80 MODULE_VERSION(my_VERSION
);
82 static int mpt_pt_clear
;
83 module_param(mpt_pt_clear
, int, 0);
84 MODULE_PARM_DESC(mpt_pt_clear
,
85 " Clear persistency table: enable=1 "
86 "(default=MPTSCSIH_PT_CLEAR=0)");
88 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
89 #define MPTSAS_MAX_LUN (16895)
90 static int max_lun
= MPTSAS_MAX_LUN
;
91 module_param(max_lun
, int, 0);
92 MODULE_PARM_DESC(max_lun
, " max lun, default=16895 ");
94 static u8 mptsasDoneCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
95 static u8 mptsasTaskCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
96 static u8 mptsasInternalCtx
= MPT_MAX_PROTOCOL_DRIVERS
; /* Used only for internal commands */
97 static u8 mptsasMgmtCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
98 static u8 mptsasDeviceResetCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
100 static void mptsas_firmware_event_work(struct work_struct
*work
);
101 static void mptsas_send_sas_event(struct fw_event_work
*fw_event
);
102 static void mptsas_send_raid_event(struct fw_event_work
*fw_event
);
103 static void mptsas_send_ir2_event(struct fw_event_work
*fw_event
);
104 static void mptsas_parse_device_info(struct sas_identify
*identify
,
105 struct mptsas_devinfo
*device_info
);
106 static inline void mptsas_set_rphy(MPT_ADAPTER
*ioc
,
107 struct mptsas_phyinfo
*phy_info
, struct sas_rphy
*rphy
);
108 static struct mptsas_phyinfo
*mptsas_find_phyinfo_by_sas_address
109 (MPT_ADAPTER
*ioc
, u64 sas_address
);
110 static int mptsas_sas_device_pg0(MPT_ADAPTER
*ioc
,
111 struct mptsas_devinfo
*device_info
, u32 form
, u32 form_specific
);
112 static int mptsas_sas_enclosure_pg0(MPT_ADAPTER
*ioc
,
113 struct mptsas_enclosure
*enclosure
, u32 form
, u32 form_specific
);
114 static int mptsas_add_end_device(MPT_ADAPTER
*ioc
,
115 struct mptsas_phyinfo
*phy_info
);
116 static void mptsas_del_end_device(MPT_ADAPTER
*ioc
,
117 struct mptsas_phyinfo
*phy_info
);
118 static void mptsas_send_link_status_event(struct fw_event_work
*fw_event
);
119 static struct mptsas_portinfo
*mptsas_find_portinfo_by_sas_address
120 (MPT_ADAPTER
*ioc
, u64 sas_address
);
121 static void mptsas_expander_delete(MPT_ADAPTER
*ioc
,
122 struct mptsas_portinfo
*port_info
, u8 force
);
123 static void mptsas_send_expander_event(struct fw_event_work
*fw_event
);
124 static void mptsas_not_responding_devices(MPT_ADAPTER
*ioc
);
125 static void mptsas_scan_sas_topology(MPT_ADAPTER
*ioc
);
126 static void mptsas_broadcast_primative_work(struct fw_event_work
*fw_event
);
127 static void mptsas_handle_queue_full_event(struct fw_event_work
*fw_event
);
128 static void mptsas_volume_delete(MPT_ADAPTER
*ioc
, u8 id
);
130 static void mptsas_print_phy_data(MPT_ADAPTER
*ioc
,
131 MPI_SAS_IO_UNIT0_PHY_DATA
*phy_data
)
133 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
134 "---- IO UNIT PAGE 0 ------------\n", ioc
->name
));
135 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Handle=0x%X\n",
136 ioc
->name
, le16_to_cpu(phy_data
->AttachedDeviceHandle
)));
137 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Controller Handle=0x%X\n",
138 ioc
->name
, le16_to_cpu(phy_data
->ControllerDevHandle
)));
139 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Port=0x%X\n",
140 ioc
->name
, phy_data
->Port
));
141 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Port Flags=0x%X\n",
142 ioc
->name
, phy_data
->PortFlags
));
143 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Flags=0x%X\n",
144 ioc
->name
, phy_data
->PhyFlags
));
145 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Negotiated Link Rate=0x%X\n",
146 ioc
->name
, phy_data
->NegotiatedLinkRate
));
147 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
148 "Controller PHY Device Info=0x%X\n", ioc
->name
,
149 le32_to_cpu(phy_data
->ControllerPhyDeviceInfo
)));
150 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"DiscoveryStatus=0x%X\n\n",
151 ioc
->name
, le32_to_cpu(phy_data
->DiscoveryStatus
)));
154 static void mptsas_print_phy_pg0(MPT_ADAPTER
*ioc
, SasPhyPage0_t
*pg0
)
158 memcpy(&sas_address
, &pg0
->SASAddress
, sizeof(__le64
));
160 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
161 "---- SAS PHY PAGE 0 ------------\n", ioc
->name
));
162 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
163 "Attached Device Handle=0x%X\n", ioc
->name
,
164 le16_to_cpu(pg0
->AttachedDevHandle
)));
165 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"SAS Address=0x%llX\n",
166 ioc
->name
, (unsigned long long)le64_to_cpu(sas_address
)));
167 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
168 "Attached PHY Identifier=0x%X\n", ioc
->name
,
169 pg0
->AttachedPhyIdentifier
));
170 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Attached Device Info=0x%X\n",
171 ioc
->name
, le32_to_cpu(pg0
->AttachedDeviceInfo
)));
172 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Programmed Link Rate=0x%X\n",
173 ioc
->name
, pg0
->ProgrammedLinkRate
));
174 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Change Count=0x%X\n",
175 ioc
->name
, pg0
->ChangeCount
));
176 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Info=0x%X\n\n",
177 ioc
->name
, le32_to_cpu(pg0
->PhyInfo
)));
180 static void mptsas_print_phy_pg1(MPT_ADAPTER
*ioc
, SasPhyPage1_t
*pg1
)
182 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
183 "---- SAS PHY PAGE 1 ------------\n", ioc
->name
));
184 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Invalid Dword Count=0x%x\n",
185 ioc
->name
, pg1
->InvalidDwordCount
));
186 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
187 "Running Disparity Error Count=0x%x\n", ioc
->name
,
188 pg1
->RunningDisparityErrorCount
));
189 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
190 "Loss Dword Synch Count=0x%x\n", ioc
->name
,
191 pg1
->LossDwordSynchCount
));
192 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
193 "PHY Reset Problem Count=0x%x\n\n", ioc
->name
,
194 pg1
->PhyResetProblemCount
));
197 static void mptsas_print_device_pg0(MPT_ADAPTER
*ioc
, SasDevicePage0_t
*pg0
)
201 memcpy(&sas_address
, &pg0
->SASAddress
, sizeof(__le64
));
203 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
204 "---- SAS DEVICE PAGE 0 ---------\n", ioc
->name
));
205 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Handle=0x%X\n",
206 ioc
->name
, le16_to_cpu(pg0
->DevHandle
)));
207 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Parent Handle=0x%X\n",
208 ioc
->name
, le16_to_cpu(pg0
->ParentDevHandle
)));
209 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Enclosure Handle=0x%X\n",
210 ioc
->name
, le16_to_cpu(pg0
->EnclosureHandle
)));
211 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Slot=0x%X\n",
212 ioc
->name
, le16_to_cpu(pg0
->Slot
)));
213 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"SAS Address=0x%llX\n",
214 ioc
->name
, (unsigned long long)le64_to_cpu(sas_address
)));
215 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Target ID=0x%X\n",
216 ioc
->name
, pg0
->TargetID
));
217 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Bus=0x%X\n",
218 ioc
->name
, pg0
->Bus
));
219 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Parent Phy Num=0x%X\n",
220 ioc
->name
, pg0
->PhyNum
));
221 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Access Status=0x%X\n",
222 ioc
->name
, le16_to_cpu(pg0
->AccessStatus
)));
223 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Device Info=0x%X\n",
224 ioc
->name
, le32_to_cpu(pg0
->DeviceInfo
)));
225 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Flags=0x%X\n",
226 ioc
->name
, le16_to_cpu(pg0
->Flags
)));
227 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Physical Port=0x%X\n\n",
228 ioc
->name
, pg0
->PhysicalPort
));
231 static void mptsas_print_expander_pg1(MPT_ADAPTER
*ioc
, SasExpanderPage1_t
*pg1
)
233 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
234 "---- SAS EXPANDER PAGE 1 ------------\n", ioc
->name
));
235 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Physical Port=0x%X\n",
236 ioc
->name
, pg1
->PhysicalPort
));
237 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Identifier=0x%X\n",
238 ioc
->name
, pg1
->PhyIdentifier
));
239 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Negotiated Link Rate=0x%X\n",
240 ioc
->name
, pg1
->NegotiatedLinkRate
));
241 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Programmed Link Rate=0x%X\n",
242 ioc
->name
, pg1
->ProgrammedLinkRate
));
243 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Hardware Link Rate=0x%X\n",
244 ioc
->name
, pg1
->HwLinkRate
));
245 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Owner Device Handle=0x%X\n",
246 ioc
->name
, le16_to_cpu(pg1
->OwnerDevHandle
)));
247 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
248 "Attached Device Handle=0x%X\n\n", ioc
->name
,
249 le16_to_cpu(pg1
->AttachedDevHandle
)));
252 /* inhibit sas firmware event handling */
254 mptsas_fw_event_off(MPT_ADAPTER
*ioc
)
258 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
259 ioc
->fw_events_off
= 1;
260 ioc
->sas_discovery_quiesce_io
= 0;
261 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
265 /* enable sas firmware event handling */
267 mptsas_fw_event_on(MPT_ADAPTER
*ioc
)
271 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
272 ioc
->fw_events_off
= 0;
273 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
276 /* queue a sas firmware event */
278 mptsas_add_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
283 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
284 list_add_tail(&fw_event
->list
, &ioc
->fw_event_list
);
285 INIT_DELAYED_WORK(&fw_event
->work
, mptsas_firmware_event_work
);
286 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: add (fw_event=0x%p)\n",
287 ioc
->name
, __func__
, fw_event
));
288 queue_delayed_work(ioc
->fw_event_q
, &fw_event
->work
,
290 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
293 /* requeue a sas firmware event */
295 mptsas_requeue_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
299 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
300 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: reschedule task "
301 "(fw_event=0x%p)\n", ioc
->name
, __func__
, fw_event
));
303 queue_delayed_work(ioc
->fw_event_q
, &fw_event
->work
,
304 msecs_to_jiffies(delay
));
305 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
308 /* free memory assoicated to a sas firmware event */
310 mptsas_free_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
)
314 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
315 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: kfree (fw_event=0x%p)\n",
316 ioc
->name
, __func__
, fw_event
));
317 list_del(&fw_event
->list
);
319 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
322 /* walk the firmware event queue, and either stop or wait for
323 * outstanding events to complete */
325 mptsas_cleanup_fw_event_q(MPT_ADAPTER
*ioc
)
327 struct fw_event_work
*fw_event
, *next
;
328 struct mptsas_target_reset_event
*target_reset_list
, *n
;
329 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
331 /* flush the target_reset_list */
332 if (!list_empty(&hd
->target_reset_list
)) {
333 list_for_each_entry_safe(target_reset_list
, n
,
334 &hd
->target_reset_list
, list
) {
335 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
336 "%s: removing target reset for id=%d\n",
338 target_reset_list
->sas_event_data
.TargetID
));
339 list_del(&target_reset_list
->list
);
340 kfree(target_reset_list
);
344 if (list_empty(&ioc
->fw_event_list
) ||
345 !ioc
->fw_event_q
|| in_interrupt())
348 list_for_each_entry_safe(fw_event
, next
, &ioc
->fw_event_list
, list
) {
349 if (cancel_delayed_work(&fw_event
->work
))
350 mptsas_free_fw_event(ioc
, fw_event
);
355 static inline MPT_ADAPTER
*phy_to_ioc(struct sas_phy
*phy
)
357 struct Scsi_Host
*shost
= dev_to_shost(phy
->dev
.parent
);
358 return ((MPT_SCSI_HOST
*)shost
->hostdata
)->ioc
;
361 static inline MPT_ADAPTER
*rphy_to_ioc(struct sas_rphy
*rphy
)
363 struct Scsi_Host
*shost
= dev_to_shost(rphy
->dev
.parent
->parent
);
364 return ((MPT_SCSI_HOST
*)shost
->hostdata
)->ioc
;
368 * mptsas_find_portinfo_by_handle
370 * This function should be called with the sas_topology_mutex already held
372 static struct mptsas_portinfo
*
373 mptsas_find_portinfo_by_handle(MPT_ADAPTER
*ioc
, u16 handle
)
375 struct mptsas_portinfo
*port_info
, *rc
=NULL
;
378 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
)
379 for (i
= 0; i
< port_info
->num_phys
; i
++)
380 if (port_info
->phy_info
[i
].identify
.handle
== handle
) {
389 * mptsas_find_portinfo_by_sas_address -
390 * @ioc: Pointer to MPT_ADAPTER structure
393 * This function should be called with the sas_topology_mutex already held
396 static struct mptsas_portinfo
*
397 mptsas_find_portinfo_by_sas_address(MPT_ADAPTER
*ioc
, u64 sas_address
)
399 struct mptsas_portinfo
*port_info
, *rc
= NULL
;
402 if (sas_address
>= ioc
->hba_port_sas_addr
&&
403 sas_address
< (ioc
->hba_port_sas_addr
+
404 ioc
->hba_port_num_phy
))
405 return ioc
->hba_port_info
;
407 mutex_lock(&ioc
->sas_topology_mutex
);
408 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
)
409 for (i
= 0; i
< port_info
->num_phys
; i
++)
410 if (port_info
->phy_info
[i
].identify
.sas_address
==
416 mutex_unlock(&ioc
->sas_topology_mutex
);
421 * Returns true if there is a scsi end device
424 mptsas_is_end_device(struct mptsas_devinfo
* attached
)
426 if ((attached
->sas_address
) &&
427 (attached
->device_info
&
428 MPI_SAS_DEVICE_INFO_END_DEVICE
) &&
429 ((attached
->device_info
&
430 MPI_SAS_DEVICE_INFO_SSP_TARGET
) |
431 (attached
->device_info
&
432 MPI_SAS_DEVICE_INFO_STP_TARGET
) |
433 (attached
->device_info
&
434 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)))
442 mptsas_port_delete(MPT_ADAPTER
*ioc
, struct mptsas_portinfo_details
* port_details
)
444 struct mptsas_portinfo
*port_info
;
445 struct mptsas_phyinfo
*phy_info
;
451 port_info
= port_details
->port_info
;
452 phy_info
= port_info
->phy_info
;
454 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: [%p]: num_phys=%02d "
455 "bitmask=0x%016llX\n", ioc
->name
, __func__
, port_details
,
456 port_details
->num_phys
, (unsigned long long)
457 port_details
->phy_bitmask
));
459 for (i
= 0; i
< port_info
->num_phys
; i
++, phy_info
++) {
460 if(phy_info
->port_details
!= port_details
)
462 memset(&phy_info
->attached
, 0, sizeof(struct mptsas_devinfo
));
463 mptsas_set_rphy(ioc
, phy_info
, NULL
);
464 phy_info
->port_details
= NULL
;
469 static inline struct sas_rphy
*
470 mptsas_get_rphy(struct mptsas_phyinfo
*phy_info
)
472 if (phy_info
->port_details
)
473 return phy_info
->port_details
->rphy
;
479 mptsas_set_rphy(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
, struct sas_rphy
*rphy
)
481 if (phy_info
->port_details
) {
482 phy_info
->port_details
->rphy
= rphy
;
483 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"sas_rphy_add: rphy=%p\n",
488 dsaswideprintk(ioc
, dev_printk(KERN_DEBUG
,
489 &rphy
->dev
, MYIOC_s_FMT
"add:", ioc
->name
));
490 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"rphy=%p release=%p\n",
491 ioc
->name
, rphy
, rphy
->dev
.release
));
495 static inline struct sas_port
*
496 mptsas_get_port(struct mptsas_phyinfo
*phy_info
)
498 if (phy_info
->port_details
)
499 return phy_info
->port_details
->port
;
505 mptsas_set_port(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
, struct sas_port
*port
)
507 if (phy_info
->port_details
)
508 phy_info
->port_details
->port
= port
;
511 dsaswideprintk(ioc
, dev_printk(KERN_DEBUG
,
512 &port
->dev
, MYIOC_s_FMT
"add:", ioc
->name
));
513 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"port=%p release=%p\n",
514 ioc
->name
, port
, port
->dev
.release
));
518 static inline struct scsi_target
*
519 mptsas_get_starget(struct mptsas_phyinfo
*phy_info
)
521 if (phy_info
->port_details
)
522 return phy_info
->port_details
->starget
;
528 mptsas_set_starget(struct mptsas_phyinfo
*phy_info
, struct scsi_target
*
531 if (phy_info
->port_details
)
532 phy_info
->port_details
->starget
= starget
;
536 * mptsas_add_device_component -
537 * @ioc: Pointer to MPT_ADAPTER structure
538 * @channel: fw mapped id's
545 mptsas_add_device_component(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
,
546 u64 sas_address
, u32 device_info
, u16 slot
, u64 enclosure_logical_id
)
548 struct mptsas_device_info
*sas_info
, *next
;
549 struct scsi_device
*sdev
;
550 struct scsi_target
*starget
;
551 struct sas_rphy
*rphy
;
554 * Delete all matching devices out of the list
556 mutex_lock(&ioc
->sas_device_info_mutex
);
557 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
559 if (!sas_info
->is_logical_volume
&&
560 (sas_info
->sas_address
== sas_address
||
561 (sas_info
->fw
.channel
== channel
&&
562 sas_info
->fw
.id
== id
))) {
563 list_del(&sas_info
->list
);
568 sas_info
= kzalloc(sizeof(struct mptsas_device_info
), GFP_KERNEL
);
573 * Set Firmware mapping
575 sas_info
->fw
.id
= id
;
576 sas_info
->fw
.channel
= channel
;
578 sas_info
->sas_address
= sas_address
;
579 sas_info
->device_info
= device_info
;
580 sas_info
->slot
= slot
;
581 sas_info
->enclosure_logical_id
= enclosure_logical_id
;
582 INIT_LIST_HEAD(&sas_info
->list
);
583 list_add_tail(&sas_info
->list
, &ioc
->sas_device_info_list
);
588 shost_for_each_device(sdev
, ioc
->sh
) {
589 starget
= scsi_target(sdev
);
590 rphy
= dev_to_rphy(starget
->dev
.parent
);
591 if (rphy
->identify
.sas_address
== sas_address
) {
592 sas_info
->os
.id
= starget
->id
;
593 sas_info
->os
.channel
= starget
->channel
;
598 mutex_unlock(&ioc
->sas_device_info_mutex
);
603 * mptsas_add_device_component_by_fw -
604 * @ioc: Pointer to MPT_ADAPTER structure
605 * @channel: fw mapped id's
610 mptsas_add_device_component_by_fw(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
612 struct mptsas_devinfo sas_device
;
613 struct mptsas_enclosure enclosure_info
;
616 rc
= mptsas_sas_device_pg0(ioc
, &sas_device
,
617 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
618 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
619 (channel
<< 8) + id
);
623 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
624 mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
625 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
626 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
),
627 sas_device
.handle_enclosure
);
629 mptsas_add_device_component(ioc
, sas_device
.channel
,
630 sas_device
.id
, sas_device
.sas_address
, sas_device
.device_info
,
631 sas_device
.slot
, enclosure_info
.enclosure_logical_id
);
635 * mptsas_add_device_component_starget_ir - Handle Integrated RAID, adding each individual device to list
636 * @ioc: Pointer to MPT_ADAPTER structure
637 * @channel: fw mapped id's
642 mptsas_add_device_component_starget_ir(MPT_ADAPTER
*ioc
,
643 struct scsi_target
*starget
)
646 ConfigPageHeader_t hdr
;
647 dma_addr_t dma_handle
;
648 pRaidVolumePage0_t buffer
= NULL
;
650 RaidPhysDiskPage0_t phys_disk
;
651 struct mptsas_device_info
*sas_info
, *next
;
653 memset(&cfg
, 0 , sizeof(CONFIGPARMS
));
654 memset(&hdr
, 0 , sizeof(ConfigPageHeader_t
));
655 hdr
.PageType
= MPI_CONFIG_PAGETYPE_RAID_VOLUME
;
656 /* assumption that all volumes on channel = 0 */
657 cfg
.pageAddr
= starget
->id
;
658 cfg
.cfghdr
.hdr
= &hdr
;
659 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
660 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
662 if (mpt_config(ioc
, &cfg
) != 0)
668 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.PageLength
* 4,
674 cfg
.physAddr
= dma_handle
;
675 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
677 if (mpt_config(ioc
, &cfg
) != 0)
680 if (!buffer
->NumPhysDisks
)
684 * Adding entry for hidden components
686 for (i
= 0; i
< buffer
->NumPhysDisks
; i
++) {
688 if (mpt_raid_phys_disk_pg0(ioc
,
689 buffer
->PhysDisk
[i
].PhysDiskNum
, &phys_disk
) != 0)
692 mptsas_add_device_component_by_fw(ioc
, phys_disk
.PhysDiskBus
,
693 phys_disk
.PhysDiskID
);
695 mutex_lock(&ioc
->sas_device_info_mutex
);
696 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
698 if (!sas_info
->is_logical_volume
&&
699 (sas_info
->fw
.channel
== phys_disk
.PhysDiskBus
&&
700 sas_info
->fw
.id
== phys_disk
.PhysDiskID
)) {
701 sas_info
->is_hidden_raid_component
= 1;
702 sas_info
->volume_id
= starget
->id
;
705 mutex_unlock(&ioc
->sas_device_info_mutex
);
710 * Delete all matching devices out of the list
712 mutex_lock(&ioc
->sas_device_info_mutex
);
713 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
715 if (sas_info
->is_logical_volume
&& sas_info
->fw
.id
==
717 list_del(&sas_info
->list
);
722 sas_info
= kzalloc(sizeof(struct mptsas_device_info
), GFP_KERNEL
);
724 sas_info
->fw
.id
= starget
->id
;
725 sas_info
->os
.id
= starget
->id
;
726 sas_info
->os
.channel
= starget
->channel
;
727 sas_info
->is_logical_volume
= 1;
728 INIT_LIST_HEAD(&sas_info
->list
);
729 list_add_tail(&sas_info
->list
, &ioc
->sas_device_info_list
);
731 mutex_unlock(&ioc
->sas_device_info_mutex
);
735 pci_free_consistent(ioc
->pcidev
, hdr
.PageLength
* 4, buffer
,
740 * mptsas_add_device_component_starget -
741 * @ioc: Pointer to MPT_ADAPTER structure
746 mptsas_add_device_component_starget(MPT_ADAPTER
*ioc
,
747 struct scsi_target
*starget
)
750 struct sas_rphy
*rphy
;
751 struct mptsas_phyinfo
*phy_info
= NULL
;
752 struct mptsas_enclosure enclosure_info
;
754 rphy
= dev_to_rphy(starget
->dev
.parent
);
755 vtarget
= starget
->hostdata
;
756 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
757 rphy
->identify
.sas_address
);
761 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
762 mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
763 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
764 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
),
765 phy_info
->attached
.handle_enclosure
);
767 mptsas_add_device_component(ioc
, phy_info
->attached
.channel
,
768 phy_info
->attached
.id
, phy_info
->attached
.sas_address
,
769 phy_info
->attached
.device_info
,
770 phy_info
->attached
.slot
, enclosure_info
.enclosure_logical_id
);
774 * mptsas_del_device_component_by_os - Once a device has been removed, we mark the entry in the list as being cached
775 * @ioc: Pointer to MPT_ADAPTER structure
776 * @channel: os mapped id's
781 mptsas_del_device_component_by_os(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
783 struct mptsas_device_info
*sas_info
, *next
;
788 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
790 if (sas_info
->os
.channel
== channel
&& sas_info
->os
.id
== id
)
791 sas_info
->is_cached
= 1;
796 * mptsas_del_device_components - Cleaning the list
797 * @ioc: Pointer to MPT_ADAPTER structure
801 mptsas_del_device_components(MPT_ADAPTER
*ioc
)
803 struct mptsas_device_info
*sas_info
, *next
;
805 mutex_lock(&ioc
->sas_device_info_mutex
);
806 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
808 list_del(&sas_info
->list
);
811 mutex_unlock(&ioc
->sas_device_info_mutex
);
816 * mptsas_setup_wide_ports
818 * Updates for new and existing narrow/wide port configuration
819 * in the sas_topology
822 mptsas_setup_wide_ports(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
824 struct mptsas_portinfo_details
* port_details
;
825 struct mptsas_phyinfo
*phy_info
, *phy_info_cmp
;
829 mutex_lock(&ioc
->sas_topology_mutex
);
831 phy_info
= port_info
->phy_info
;
832 for (i
= 0 ; i
< port_info
->num_phys
; i
++, phy_info
++) {
833 if (phy_info
->attached
.handle
)
835 port_details
= phy_info
->port_details
;
838 if (port_details
->num_phys
< 2)
841 * Removing a phy from a port, letting the last
842 * phy be removed by firmware events.
844 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
845 "%s: [%p]: deleting phy = %d\n",
846 ioc
->name
, __func__
, port_details
, i
));
847 port_details
->num_phys
--;
848 port_details
->phy_bitmask
&= ~ (1 << phy_info
->phy_id
);
849 memset(&phy_info
->attached
, 0, sizeof(struct mptsas_devinfo
));
851 devtprintk(ioc
, dev_printk(KERN_DEBUG
,
852 &phy_info
->phy
->dev
, MYIOC_s_FMT
853 "delete phy %d, phy-obj (0x%p)\n", ioc
->name
,
854 phy_info
->phy_id
, phy_info
->phy
));
855 sas_port_delete_phy(port_details
->port
, phy_info
->phy
);
857 phy_info
->port_details
= NULL
;
861 * Populate and refresh the tree
863 phy_info
= port_info
->phy_info
;
864 for (i
= 0 ; i
< port_info
->num_phys
; i
++, phy_info
++) {
865 sas_address
= phy_info
->attached
.sas_address
;
866 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"phy_id=%d sas_address=0x%018llX\n",
867 ioc
->name
, i
, (unsigned long long)sas_address
));
870 port_details
= phy_info
->port_details
;
875 port_details
= kzalloc(sizeof(struct
876 mptsas_portinfo_details
), GFP_KERNEL
);
879 port_details
->num_phys
= 1;
880 port_details
->port_info
= port_info
;
881 if (phy_info
->phy_id
< 64 )
882 port_details
->phy_bitmask
|=
883 (1 << phy_info
->phy_id
);
884 phy_info
->sas_port_add_phy
=1;
885 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"\t\tForming port\n\t\t"
886 "phy_id=%d sas_address=0x%018llX\n",
887 ioc
->name
, i
, (unsigned long long)sas_address
));
888 phy_info
->port_details
= port_details
;
891 if (i
== port_info
->num_phys
- 1)
893 phy_info_cmp
= &port_info
->phy_info
[i
+ 1];
894 for (j
= i
+ 1 ; j
< port_info
->num_phys
; j
++,
896 if (!phy_info_cmp
->attached
.sas_address
)
898 if (sas_address
!= phy_info_cmp
->attached
.sas_address
)
900 if (phy_info_cmp
->port_details
== port_details
)
902 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
903 "\t\tphy_id=%d sas_address=0x%018llX\n",
904 ioc
->name
, j
, (unsigned long long)
905 phy_info_cmp
->attached
.sas_address
));
906 if (phy_info_cmp
->port_details
) {
908 mptsas_get_rphy(phy_info_cmp
);
910 mptsas_get_port(phy_info_cmp
);
911 port_details
->starget
=
912 mptsas_get_starget(phy_info_cmp
);
913 port_details
->num_phys
=
914 phy_info_cmp
->port_details
->num_phys
;
915 if (!phy_info_cmp
->port_details
->num_phys
)
916 kfree(phy_info_cmp
->port_details
);
918 phy_info_cmp
->sas_port_add_phy
=1;
920 * Adding a phy to a port
922 phy_info_cmp
->port_details
= port_details
;
923 if (phy_info_cmp
->phy_id
< 64 )
924 port_details
->phy_bitmask
|=
925 (1 << phy_info_cmp
->phy_id
);
926 port_details
->num_phys
++;
932 for (i
= 0; i
< port_info
->num_phys
; i
++) {
933 port_details
= port_info
->phy_info
[i
].port_details
;
936 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
937 "%s: [%p]: phy_id=%02d num_phys=%02d "
938 "bitmask=0x%016llX\n", ioc
->name
, __func__
,
939 port_details
, i
, port_details
->num_phys
,
940 (unsigned long long)port_details
->phy_bitmask
));
941 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"\t\tport = %p rphy=%p\n",
942 ioc
->name
, port_details
->port
, port_details
->rphy
));
944 dsaswideprintk(ioc
, printk("\n"));
945 mutex_unlock(&ioc
->sas_topology_mutex
);
949 * csmisas_find_vtarget
957 mptsas_find_vtarget(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
959 struct scsi_device
*sdev
;
961 VirtTarget
*vtarget
= NULL
;
963 shost_for_each_device(sdev
, ioc
->sh
) {
964 vdevice
= sdev
->hostdata
;
965 if ((vdevice
== NULL
) ||
966 (vdevice
->vtarget
== NULL
))
968 if ((vdevice
->vtarget
->tflags
&
969 MPT_TARGET_FLAGS_RAID_COMPONENT
||
970 vdevice
->vtarget
->raidVolume
))
972 if (vdevice
->vtarget
->id
== id
&&
973 vdevice
->vtarget
->channel
== channel
)
974 vtarget
= vdevice
->vtarget
;
980 mptsas_queue_device_delete(MPT_ADAPTER
*ioc
,
981 MpiEventDataSasDeviceStatusChange_t
*sas_event_data
)
983 struct fw_event_work
*fw_event
;
986 sz
= offsetof(struct fw_event_work
, event_data
) +
987 sizeof(MpiEventDataSasDeviceStatusChange_t
);
988 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
990 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n",
991 ioc
->name
, __func__
, __LINE__
);
994 memcpy(fw_event
->event_data
, sas_event_data
,
995 sizeof(MpiEventDataSasDeviceStatusChange_t
));
996 fw_event
->event
= MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
;
998 mptsas_add_fw_event(ioc
, fw_event
, msecs_to_jiffies(1));
1002 mptsas_queue_rescan(MPT_ADAPTER
*ioc
)
1004 struct fw_event_work
*fw_event
;
1007 sz
= offsetof(struct fw_event_work
, event_data
);
1008 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
1010 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n",
1011 ioc
->name
, __func__
, __LINE__
);
1014 fw_event
->event
= -1;
1015 fw_event
->ioc
= ioc
;
1016 mptsas_add_fw_event(ioc
, fw_event
, msecs_to_jiffies(1));
1021 * mptsas_target_reset
1023 * Issues TARGET_RESET to end device using handshaking method
1029 * Returns (1) success
1034 mptsas_target_reset(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
1037 SCSITaskMgmt_t
*pScsiTm
;
1038 if (mpt_set_taskmgmt_in_progress_flag(ioc
) != 0)
1042 mf
= mpt_get_msg_frame(mptsasDeviceResetCtx
, ioc
);
1044 dfailprintk(ioc
, printk(MYIOC_s_WARN_FMT
1045 "%s, no msg frames @%d!!\n", ioc
->name
,
1046 __func__
, __LINE__
));
1050 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt request (mf=%p)\n",
1053 /* Format the Request
1055 pScsiTm
= (SCSITaskMgmt_t
*) mf
;
1056 memset (pScsiTm
, 0, sizeof(SCSITaskMgmt_t
));
1057 pScsiTm
->TargetID
= id
;
1058 pScsiTm
->Bus
= channel
;
1059 pScsiTm
->Function
= MPI_FUNCTION_SCSI_TASK_MGMT
;
1060 pScsiTm
->TaskType
= MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET
;
1061 pScsiTm
->MsgFlags
= MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION
;
1063 DBG_DUMP_TM_REQUEST_FRAME(ioc
, (u32
*)mf
);
1065 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1066 "TaskMgmt type=%d (sas device delete) fw_channel = %d fw_id = %d)\n",
1067 ioc
->name
, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET
, channel
, id
));
1069 mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx
, ioc
, mf
);
1075 mpt_clear_taskmgmt_in_progress_flag(ioc
);
1080 mptsas_block_io_sdev(struct scsi_device
*sdev
, void *data
)
1082 scsi_device_set_state(sdev
, SDEV_BLOCK
);
1086 mptsas_block_io_starget(struct scsi_target
*starget
)
1089 starget_for_each_device(starget
, NULL
, mptsas_block_io_sdev
);
1093 * mptsas_target_reset_queue
1095 * Receive request for TARGET_RESET after recieving an firmware
1096 * event NOT_RESPONDING_EVENT, then put command in link list
1097 * and queue if task_queue already in use.
1104 mptsas_target_reset_queue(MPT_ADAPTER
*ioc
,
1105 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
)
1107 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
1108 VirtTarget
*vtarget
= NULL
;
1109 struct mptsas_target_reset_event
*target_reset_list
;
1112 id
= sas_event_data
->TargetID
;
1113 channel
= sas_event_data
->Bus
;
1115 vtarget
= mptsas_find_vtarget(ioc
, channel
, id
);
1117 mptsas_block_io_starget(vtarget
->starget
);
1118 vtarget
->deleted
= 1; /* block IO */
1121 target_reset_list
= kzalloc(sizeof(struct mptsas_target_reset_event
),
1123 if (!target_reset_list
) {
1124 dfailprintk(ioc
, printk(MYIOC_s_WARN_FMT
1125 "%s, failed to allocate mem @%d..!!\n",
1126 ioc
->name
, __func__
, __LINE__
));
1130 memcpy(&target_reset_list
->sas_event_data
, sas_event_data
,
1131 sizeof(*sas_event_data
));
1132 list_add_tail(&target_reset_list
->list
, &hd
->target_reset_list
);
1134 target_reset_list
->time_count
= jiffies
;
1136 if (mptsas_target_reset(ioc
, channel
, id
)) {
1137 target_reset_list
->target_reset_issued
= 1;
1142 * mptsas_taskmgmt_complete - complete SAS task management function
1143 * @ioc: Pointer to MPT_ADAPTER structure
1145 * Completion for TARGET_RESET after NOT_RESPONDING_EVENT, enable work
1146 * queue to finish off removing device from upper layers. then send next
1147 * TARGET_RESET in the queue.
1150 mptsas_taskmgmt_complete(MPT_ADAPTER
*ioc
, MPT_FRAME_HDR
*mf
, MPT_FRAME_HDR
*mr
)
1152 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
1153 struct list_head
*head
= &hd
->target_reset_list
;
1155 struct mptsas_target_reset_event
*target_reset_list
;
1156 SCSITaskMgmtReply_t
*pScsiTmReply
;
1158 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt completed: "
1159 "(mf = %p, mr = %p)\n", ioc
->name
, mf
, mr
));
1161 pScsiTmReply
= (SCSITaskMgmtReply_t
*)mr
;
1163 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1164 "\tTaskMgmt completed: fw_channel = %d, fw_id = %d,\n"
1165 "\ttask_type = 0x%02X, iocstatus = 0x%04X "
1166 "loginfo = 0x%08X,\n\tresponse_code = 0x%02X, "
1167 "term_cmnds = %d\n", ioc
->name
,
1168 pScsiTmReply
->Bus
, pScsiTmReply
->TargetID
,
1169 pScsiTmReply
->TaskType
,
1170 le16_to_cpu(pScsiTmReply
->IOCStatus
),
1171 le32_to_cpu(pScsiTmReply
->IOCLogInfo
),
1172 pScsiTmReply
->ResponseCode
,
1173 le32_to_cpu(pScsiTmReply
->TerminationCount
)));
1175 if (pScsiTmReply
->ResponseCode
)
1176 mptscsih_taskmgmt_response_code(ioc
,
1177 pScsiTmReply
->ResponseCode
);
1180 if (pScsiTmReply
&& (pScsiTmReply
->TaskType
==
1181 MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK
|| pScsiTmReply
->TaskType
==
1182 MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET
)) {
1183 ioc
->taskmgmt_cmds
.status
|= MPT_MGMT_STATUS_COMMAND_GOOD
;
1184 ioc
->taskmgmt_cmds
.status
|= MPT_MGMT_STATUS_RF_VALID
;
1185 memcpy(ioc
->taskmgmt_cmds
.reply
, mr
,
1186 min(MPT_DEFAULT_FRAME_SIZE
, 4 * mr
->u
.reply
.MsgLength
));
1187 if (ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_PENDING
) {
1188 ioc
->taskmgmt_cmds
.status
&= ~MPT_MGMT_STATUS_PENDING
;
1189 complete(&ioc
->taskmgmt_cmds
.done
);
1195 mpt_clear_taskmgmt_in_progress_flag(ioc
);
1197 if (list_empty(head
))
1200 target_reset_list
= list_entry(head
->next
,
1201 struct mptsas_target_reset_event
, list
);
1203 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1204 "TaskMgmt: completed (%d seconds)\n",
1205 ioc
->name
, jiffies_to_msecs(jiffies
-
1206 target_reset_list
->time_count
)/1000));
1208 id
= pScsiTmReply
->TargetID
;
1209 channel
= pScsiTmReply
->Bus
;
1210 target_reset_list
->time_count
= jiffies
;
1213 * retry target reset
1215 if (!target_reset_list
->target_reset_issued
) {
1216 if (mptsas_target_reset(ioc
, channel
, id
))
1217 target_reset_list
->target_reset_issued
= 1;
1222 * enable work queue to remove device from upper layers
1224 list_del(&target_reset_list
->list
);
1225 if ((mptsas_find_vtarget(ioc
, channel
, id
)) && !ioc
->fw_events_off
)
1226 mptsas_queue_device_delete(ioc
,
1227 &target_reset_list
->sas_event_data
);
1231 * issue target reset to next device in the queue
1234 head
= &hd
->target_reset_list
;
1235 if (list_empty(head
))
1238 target_reset_list
= list_entry(head
->next
, struct mptsas_target_reset_event
,
1241 id
= target_reset_list
->sas_event_data
.TargetID
;
1242 channel
= target_reset_list
->sas_event_data
.Bus
;
1243 target_reset_list
->time_count
= jiffies
;
1245 if (mptsas_target_reset(ioc
, channel
, id
))
1246 target_reset_list
->target_reset_issued
= 1;
1252 * mptscsih_ioc_reset
1259 mptsas_ioc_reset(MPT_ADAPTER
*ioc
, int reset_phase
)
1264 rc
= mptscsih_ioc_reset(ioc
, reset_phase
);
1265 if ((ioc
->bus_type
!= SAS
) || (!rc
))
1268 hd
= shost_priv(ioc
->sh
);
1272 switch (reset_phase
) {
1273 case MPT_IOC_SETUP_RESET
:
1274 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1275 "%s: MPT_IOC_SETUP_RESET\n", ioc
->name
, __func__
));
1276 mptsas_fw_event_off(ioc
);
1278 case MPT_IOC_PRE_RESET
:
1279 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1280 "%s: MPT_IOC_PRE_RESET\n", ioc
->name
, __func__
));
1282 case MPT_IOC_POST_RESET
:
1283 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1284 "%s: MPT_IOC_POST_RESET\n", ioc
->name
, __func__
));
1285 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_PENDING
) {
1286 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_DID_IOCRESET
;
1287 complete(&ioc
->sas_mgmt
.done
);
1289 mptsas_cleanup_fw_event_q(ioc
);
1290 mptsas_queue_rescan(ioc
);
1302 * enum device_state -
1303 * @DEVICE_RETRY: need to retry the TUR
1304 * @DEVICE_ERROR: TUR return error, don't add device
1305 * @DEVICE_READY: device can be added
1315 mptsas_sas_enclosure_pg0(MPT_ADAPTER
*ioc
, struct mptsas_enclosure
*enclosure
,
1316 u32 form
, u32 form_specific
)
1318 ConfigExtendedPageHeader_t hdr
;
1320 SasEnclosurePage0_t
*buffer
;
1321 dma_addr_t dma_handle
;
1323 __le64 le_identifier
;
1325 memset(&hdr
, 0, sizeof(hdr
));
1326 hdr
.PageVersion
= MPI_SASENCLOSURE0_PAGEVERSION
;
1328 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
1329 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_ENCLOSURE
;
1331 cfg
.cfghdr
.ehdr
= &hdr
;
1333 cfg
.pageAddr
= form
+ form_specific
;
1334 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
1335 cfg
.dir
= 0; /* read */
1336 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
1338 error
= mpt_config(ioc
, &cfg
);
1341 if (!hdr
.ExtPageLength
) {
1346 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1353 cfg
.physAddr
= dma_handle
;
1354 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
1356 error
= mpt_config(ioc
, &cfg
);
1358 goto out_free_consistent
;
1360 /* save config data */
1361 memcpy(&le_identifier
, &buffer
->EnclosureLogicalID
, sizeof(__le64
));
1362 enclosure
->enclosure_logical_id
= le64_to_cpu(le_identifier
);
1363 enclosure
->enclosure_handle
= le16_to_cpu(buffer
->EnclosureHandle
);
1364 enclosure
->flags
= le16_to_cpu(buffer
->Flags
);
1365 enclosure
->num_slot
= le16_to_cpu(buffer
->NumSlots
);
1366 enclosure
->start_slot
= le16_to_cpu(buffer
->StartSlot
);
1367 enclosure
->start_id
= buffer
->StartTargetID
;
1368 enclosure
->start_channel
= buffer
->StartBus
;
1369 enclosure
->sep_id
= buffer
->SEPTargetID
;
1370 enclosure
->sep_channel
= buffer
->SEPBus
;
1372 out_free_consistent
:
1373 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1374 buffer
, dma_handle
);
1380 * mptsas_add_end_device - report a new end device to sas transport layer
1381 * @ioc: Pointer to MPT_ADAPTER structure
1382 * @phy_info: decribes attached device
1384 * return (0) success (1) failure
1388 mptsas_add_end_device(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
)
1390 struct sas_rphy
*rphy
;
1391 struct sas_port
*port
;
1392 struct sas_identify identify
;
1397 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1398 "%s: exit at line=%d\n", ioc
->name
,
1399 __func__
, __LINE__
));
1403 fw_id
= phy_info
->attached
.id
;
1405 if (mptsas_get_rphy(phy_info
)) {
1406 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1407 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1408 __func__
, fw_id
, __LINE__
));
1412 port
= mptsas_get_port(phy_info
);
1414 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1415 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1416 __func__
, fw_id
, __LINE__
));
1420 if (phy_info
->attached
.device_info
&
1421 MPI_SAS_DEVICE_INFO_SSP_TARGET
)
1423 if (phy_info
->attached
.device_info
&
1424 MPI_SAS_DEVICE_INFO_STP_TARGET
)
1426 if (phy_info
->attached
.device_info
&
1427 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
1430 printk(MYIOC_s_INFO_FMT
"attaching %s device: fw_channel %d, fw_id %d,"
1431 " phy %d, sas_addr 0x%llx\n", ioc
->name
, ds
,
1432 phy_info
->attached
.channel
, phy_info
->attached
.id
,
1433 phy_info
->attached
.phy_id
, (unsigned long long)
1434 phy_info
->attached
.sas_address
);
1436 mptsas_parse_device_info(&identify
, &phy_info
->attached
);
1437 rphy
= sas_end_device_alloc(port
);
1439 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1440 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1441 __func__
, fw_id
, __LINE__
));
1442 return 5; /* non-fatal: an rphy can be added later */
1445 rphy
->identify
= identify
;
1446 if (sas_rphy_add(rphy
)) {
1447 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1448 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1449 __func__
, fw_id
, __LINE__
));
1450 sas_rphy_free(rphy
);
1453 mptsas_set_rphy(ioc
, phy_info
, rphy
);
1458 * mptsas_del_end_device - report a deleted end device to sas transport layer
1459 * @ioc: Pointer to MPT_ADAPTER structure
1460 * @phy_info: decribes attached device
1464 mptsas_del_end_device(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
)
1466 struct sas_rphy
*rphy
;
1467 struct sas_port
*port
;
1468 struct mptsas_portinfo
*port_info
;
1469 struct mptsas_phyinfo
*phy_info_parent
;
1478 fw_id
= phy_info
->attached
.id
;
1479 sas_address
= phy_info
->attached
.sas_address
;
1481 if (!phy_info
->port_details
) {
1482 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1483 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1484 __func__
, fw_id
, __LINE__
));
1487 rphy
= mptsas_get_rphy(phy_info
);
1489 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1490 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1491 __func__
, fw_id
, __LINE__
));
1495 if (phy_info
->attached
.device_info
& MPI_SAS_DEVICE_INFO_SSP_INITIATOR
1496 || phy_info
->attached
.device_info
1497 & MPI_SAS_DEVICE_INFO_SMP_INITIATOR
1498 || phy_info
->attached
.device_info
1499 & MPI_SAS_DEVICE_INFO_STP_INITIATOR
)
1501 if (phy_info
->attached
.device_info
&
1502 MPI_SAS_DEVICE_INFO_SSP_TARGET
)
1504 if (phy_info
->attached
.device_info
&
1505 MPI_SAS_DEVICE_INFO_STP_TARGET
)
1507 if (phy_info
->attached
.device_info
&
1508 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
1511 dev_printk(KERN_DEBUG
, &rphy
->dev
, MYIOC_s_FMT
1512 "removing %s device: fw_channel %d, fw_id %d, phy %d,"
1513 "sas_addr 0x%llx\n", ioc
->name
, ds
, phy_info
->attached
.channel
,
1514 phy_info
->attached
.id
, phy_info
->attached
.phy_id
,
1515 (unsigned long long) sas_address
);
1517 port
= mptsas_get_port(phy_info
);
1519 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1520 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1521 __func__
, fw_id
, __LINE__
));
1524 port_info
= phy_info
->portinfo
;
1525 phy_info_parent
= port_info
->phy_info
;
1526 for (i
= 0; i
< port_info
->num_phys
; i
++, phy_info_parent
++) {
1527 if (!phy_info_parent
->phy
)
1529 if (phy_info_parent
->attached
.sas_address
!=
1532 dev_printk(KERN_DEBUG
, &phy_info_parent
->phy
->dev
,
1533 MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n",
1534 ioc
->name
, phy_info_parent
->phy_id
,
1535 phy_info_parent
->phy
);
1536 sas_port_delete_phy(port
, phy_info_parent
->phy
);
1539 dev_printk(KERN_DEBUG
, &port
->dev
, MYIOC_s_FMT
1540 "delete port %d, sas_addr (0x%llx)\n", ioc
->name
,
1541 port
->port_identifier
, (unsigned long long)sas_address
);
1542 sas_port_delete(port
);
1543 mptsas_set_port(ioc
, phy_info
, NULL
);
1544 mptsas_port_delete(ioc
, phy_info
->port_details
);
1547 struct mptsas_phyinfo
*
1548 mptsas_refreshing_device_handles(MPT_ADAPTER
*ioc
,
1549 struct mptsas_devinfo
*sas_device
)
1551 struct mptsas_phyinfo
*phy_info
;
1552 struct mptsas_portinfo
*port_info
;
1555 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
1556 sas_device
->sas_address
);
1559 port_info
= phy_info
->portinfo
;
1562 mutex_lock(&ioc
->sas_topology_mutex
);
1563 for (i
= 0; i
< port_info
->num_phys
; i
++) {
1564 if (port_info
->phy_info
[i
].attached
.sas_address
!=
1565 sas_device
->sas_address
)
1567 port_info
->phy_info
[i
].attached
.channel
= sas_device
->channel
;
1568 port_info
->phy_info
[i
].attached
.id
= sas_device
->id
;
1569 port_info
->phy_info
[i
].attached
.sas_address
=
1570 sas_device
->sas_address
;
1571 port_info
->phy_info
[i
].attached
.handle
= sas_device
->handle
;
1572 port_info
->phy_info
[i
].attached
.handle_parent
=
1573 sas_device
->handle_parent
;
1574 port_info
->phy_info
[i
].attached
.handle_enclosure
=
1575 sas_device
->handle_enclosure
;
1577 mutex_unlock(&ioc
->sas_topology_mutex
);
1583 * mptsas_firmware_event_work - work thread for processing fw events
1584 * @work: work queue payload containing info describing the event
1589 mptsas_firmware_event_work(struct work_struct
*work
)
1591 struct fw_event_work
*fw_event
=
1592 container_of(work
, struct fw_event_work
, work
.work
);
1593 MPT_ADAPTER
*ioc
= fw_event
->ioc
;
1595 /* special rescan topology handling */
1596 if (fw_event
->event
== -1) {
1597 if (ioc
->in_rescan
) {
1598 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1599 "%s: rescan ignored as it is in progress\n",
1600 ioc
->name
, __func__
));
1603 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: rescan after "
1604 "reset\n", ioc
->name
, __func__
));
1606 mptsas_not_responding_devices(ioc
);
1607 mptsas_scan_sas_topology(ioc
);
1609 mptsas_free_fw_event(ioc
, fw_event
);
1610 mptsas_fw_event_on(ioc
);
1614 /* events handling turned off during host reset */
1615 if (ioc
->fw_events_off
) {
1616 mptsas_free_fw_event(ioc
, fw_event
);
1620 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: fw_event=(0x%p), "
1621 "event = (0x%02x)\n", ioc
->name
, __func__
, fw_event
,
1622 (fw_event
->event
& 0xFF)));
1624 switch (fw_event
->event
) {
1625 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
:
1626 mptsas_send_sas_event(fw_event
);
1628 case MPI_EVENT_INTEGRATED_RAID
:
1629 mptsas_send_raid_event(fw_event
);
1632 mptsas_send_ir2_event(fw_event
);
1634 case MPI_EVENT_PERSISTENT_TABLE_FULL
:
1635 mptbase_sas_persist_operation(ioc
,
1636 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
1637 mptsas_free_fw_event(ioc
, fw_event
);
1639 case MPI_EVENT_SAS_BROADCAST_PRIMITIVE
:
1640 mptsas_broadcast_primative_work(fw_event
);
1642 case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE
:
1643 mptsas_send_expander_event(fw_event
);
1645 case MPI_EVENT_SAS_PHY_LINK_STATUS
:
1646 mptsas_send_link_status_event(fw_event
);
1648 case MPI_EVENT_QUEUE_FULL
:
1649 mptsas_handle_queue_full_event(fw_event
);
1657 mptsas_slave_configure(struct scsi_device
*sdev
)
1659 struct Scsi_Host
*host
= sdev
->host
;
1660 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1661 MPT_ADAPTER
*ioc
= hd
->ioc
;
1662 VirtDevice
*vdevice
= sdev
->hostdata
;
1664 if (vdevice
->vtarget
->deleted
) {
1665 sdev_printk(KERN_INFO
, sdev
, "clearing deleted flag\n");
1666 vdevice
->vtarget
->deleted
= 0;
1670 * RAID volumes placed beyond the last expected port.
1671 * Ignore sending sas mode pages in that case..
1673 if (sdev
->channel
== MPTSAS_RAID_CHANNEL
) {
1674 mptsas_add_device_component_starget_ir(ioc
, scsi_target(sdev
));
1678 sas_read_port_mode_page(sdev
);
1680 mptsas_add_device_component_starget(ioc
, scsi_target(sdev
));
1683 return mptscsih_slave_configure(sdev
);
1687 mptsas_target_alloc(struct scsi_target
*starget
)
1689 struct Scsi_Host
*host
= dev_to_shost(&starget
->dev
);
1690 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1691 VirtTarget
*vtarget
;
1693 struct sas_rphy
*rphy
;
1694 struct mptsas_portinfo
*p
;
1696 MPT_ADAPTER
*ioc
= hd
->ioc
;
1698 vtarget
= kzalloc(sizeof(VirtTarget
), GFP_KERNEL
);
1702 vtarget
->starget
= starget
;
1703 vtarget
->ioc_id
= ioc
->id
;
1704 vtarget
->tflags
= MPT_TARGET_FLAGS_Q_YES
;
1709 * RAID volumes placed beyond the last expected port.
1711 if (starget
->channel
== MPTSAS_RAID_CHANNEL
) {
1712 if (!ioc
->raid_data
.pIocPg2
) {
1716 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
1717 if (id
== ioc
->raid_data
.pIocPg2
->
1718 RaidVolume
[i
].VolumeID
) {
1719 channel
= ioc
->raid_data
.pIocPg2
->
1720 RaidVolume
[i
].VolumeBus
;
1723 vtarget
->raidVolume
= 1;
1727 rphy
= dev_to_rphy(starget
->dev
.parent
);
1728 mutex_lock(&ioc
->sas_topology_mutex
);
1729 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1730 for (i
= 0; i
< p
->num_phys
; i
++) {
1731 if (p
->phy_info
[i
].attached
.sas_address
!=
1732 rphy
->identify
.sas_address
)
1734 id
= p
->phy_info
[i
].attached
.id
;
1735 channel
= p
->phy_info
[i
].attached
.channel
;
1736 mptsas_set_starget(&p
->phy_info
[i
], starget
);
1739 * Exposing hidden raid components
1741 if (mptscsih_is_phys_disk(ioc
, channel
, id
)) {
1742 id
= mptscsih_raid_id_to_num(ioc
,
1745 MPT_TARGET_FLAGS_RAID_COMPONENT
;
1746 p
->phy_info
[i
].attached
.phys_disk_num
= id
;
1748 mutex_unlock(&ioc
->sas_topology_mutex
);
1752 mutex_unlock(&ioc
->sas_topology_mutex
);
1759 vtarget
->channel
= channel
;
1760 starget
->hostdata
= vtarget
;
1765 mptsas_target_destroy(struct scsi_target
*starget
)
1767 struct Scsi_Host
*host
= dev_to_shost(&starget
->dev
);
1768 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1769 struct sas_rphy
*rphy
;
1770 struct mptsas_portinfo
*p
;
1772 MPT_ADAPTER
*ioc
= hd
->ioc
;
1773 VirtTarget
*vtarget
;
1775 if (!starget
->hostdata
)
1778 vtarget
= starget
->hostdata
;
1780 mptsas_del_device_component_by_os(ioc
, starget
->channel
,
1784 if (starget
->channel
== MPTSAS_RAID_CHANNEL
)
1787 rphy
= dev_to_rphy(starget
->dev
.parent
);
1788 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1789 for (i
= 0; i
< p
->num_phys
; i
++) {
1790 if (p
->phy_info
[i
].attached
.sas_address
!=
1791 rphy
->identify
.sas_address
)
1794 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
1795 "delete device: fw_channel %d, fw_id %d, phy %d, "
1796 "sas_addr 0x%llx\n", ioc
->name
,
1797 p
->phy_info
[i
].attached
.channel
,
1798 p
->phy_info
[i
].attached
.id
,
1799 p
->phy_info
[i
].attached
.phy_id
, (unsigned long long)
1800 p
->phy_info
[i
].attached
.sas_address
);
1802 mptsas_set_starget(&p
->phy_info
[i
], NULL
);
1807 vtarget
->starget
= NULL
;
1808 kfree(starget
->hostdata
);
1809 starget
->hostdata
= NULL
;
1814 mptsas_slave_alloc(struct scsi_device
*sdev
)
1816 struct Scsi_Host
*host
= sdev
->host
;
1817 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1818 struct sas_rphy
*rphy
;
1819 struct mptsas_portinfo
*p
;
1820 VirtDevice
*vdevice
;
1821 struct scsi_target
*starget
;
1823 MPT_ADAPTER
*ioc
= hd
->ioc
;
1825 vdevice
= kzalloc(sizeof(VirtDevice
), GFP_KERNEL
);
1827 printk(MYIOC_s_ERR_FMT
"slave_alloc kzalloc(%zd) FAILED!\n",
1828 ioc
->name
, sizeof(VirtDevice
));
1831 starget
= scsi_target(sdev
);
1832 vdevice
->vtarget
= starget
->hostdata
;
1834 if (sdev
->channel
== MPTSAS_RAID_CHANNEL
)
1837 rphy
= dev_to_rphy(sdev
->sdev_target
->dev
.parent
);
1838 mutex_lock(&ioc
->sas_topology_mutex
);
1839 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1840 for (i
= 0; i
< p
->num_phys
; i
++) {
1841 if (p
->phy_info
[i
].attached
.sas_address
!=
1842 rphy
->identify
.sas_address
)
1844 vdevice
->lun
= sdev
->lun
;
1846 * Exposing hidden raid components
1848 if (mptscsih_is_phys_disk(ioc
,
1849 p
->phy_info
[i
].attached
.channel
,
1850 p
->phy_info
[i
].attached
.id
))
1851 sdev
->no_uld_attach
= 1;
1852 mutex_unlock(&ioc
->sas_topology_mutex
);
1856 mutex_unlock(&ioc
->sas_topology_mutex
);
1862 vdevice
->vtarget
->num_luns
++;
1863 sdev
->hostdata
= vdevice
;
1868 mptsas_qcmd(struct scsi_cmnd
*SCpnt
, void (*done
)(struct scsi_cmnd
*))
1872 VirtDevice
*vdevice
= SCpnt
->device
->hostdata
;
1874 if (!vdevice
|| !vdevice
->vtarget
|| vdevice
->vtarget
->deleted
) {
1875 SCpnt
->result
= DID_NO_CONNECT
<< 16;
1880 hd
= shost_priv(SCpnt
->device
->host
);
1883 if (ioc
->sas_discovery_quiesce_io
)
1884 return SCSI_MLQUEUE_HOST_BUSY
;
1886 if (ioc
->debug_level
& MPT_DEBUG_SCSI
)
1887 scsi_print_command(SCpnt
);
1889 return mptscsih_qcmd(SCpnt
,done
);
1893 static struct scsi_host_template mptsas_driver_template
= {
1894 .module
= THIS_MODULE
,
1895 .proc_name
= "mptsas",
1896 .proc_info
= mptscsih_proc_info
,
1897 .name
= "MPT SAS Host",
1898 .info
= mptscsih_info
,
1899 .queuecommand
= mptsas_qcmd
,
1900 .target_alloc
= mptsas_target_alloc
,
1901 .slave_alloc
= mptsas_slave_alloc
,
1902 .slave_configure
= mptsas_slave_configure
,
1903 .target_destroy
= mptsas_target_destroy
,
1904 .slave_destroy
= mptscsih_slave_destroy
,
1905 .change_queue_depth
= mptscsih_change_queue_depth
,
1906 .eh_abort_handler
= mptscsih_abort
,
1907 .eh_device_reset_handler
= mptscsih_dev_reset
,
1908 .eh_bus_reset_handler
= mptscsih_bus_reset
,
1909 .eh_host_reset_handler
= mptscsih_host_reset
,
1910 .bios_param
= mptscsih_bios_param
,
1911 .can_queue
= MPT_SAS_CAN_QUEUE
,
1913 .sg_tablesize
= MPT_SCSI_SG_DEPTH
,
1914 .max_sectors
= 8192,
1916 .use_clustering
= ENABLE_CLUSTERING
,
1917 .shost_attrs
= mptscsih_host_attrs
,
1920 static int mptsas_get_linkerrors(struct sas_phy
*phy
)
1922 MPT_ADAPTER
*ioc
= phy_to_ioc(phy
);
1923 ConfigExtendedPageHeader_t hdr
;
1925 SasPhyPage1_t
*buffer
;
1926 dma_addr_t dma_handle
;
1929 /* FIXME: only have link errors on local phys */
1930 if (!scsi_is_sas_phy_local(phy
))
1933 hdr
.PageVersion
= MPI_SASPHY1_PAGEVERSION
;
1934 hdr
.ExtPageLength
= 0;
1935 hdr
.PageNumber
= 1 /* page number 1*/;
1938 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
1939 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_PHY
;
1941 cfg
.cfghdr
.ehdr
= &hdr
;
1943 cfg
.pageAddr
= phy
->identify
.phy_identifier
;
1944 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
1945 cfg
.dir
= 0; /* read */
1946 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
1948 error
= mpt_config(ioc
, &cfg
);
1951 if (!hdr
.ExtPageLength
)
1954 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1959 cfg
.physAddr
= dma_handle
;
1960 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
1962 error
= mpt_config(ioc
, &cfg
);
1964 goto out_free_consistent
;
1966 mptsas_print_phy_pg1(ioc
, buffer
);
1968 phy
->invalid_dword_count
= le32_to_cpu(buffer
->InvalidDwordCount
);
1969 phy
->running_disparity_error_count
=
1970 le32_to_cpu(buffer
->RunningDisparityErrorCount
);
1971 phy
->loss_of_dword_sync_count
=
1972 le32_to_cpu(buffer
->LossDwordSynchCount
);
1973 phy
->phy_reset_problem_count
=
1974 le32_to_cpu(buffer
->PhyResetProblemCount
);
1976 out_free_consistent
:
1977 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1978 buffer
, dma_handle
);
1982 static int mptsas_mgmt_done(MPT_ADAPTER
*ioc
, MPT_FRAME_HDR
*req
,
1983 MPT_FRAME_HDR
*reply
)
1985 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_COMMAND_GOOD
;
1986 if (reply
!= NULL
) {
1987 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_RF_VALID
;
1988 memcpy(ioc
->sas_mgmt
.reply
, reply
,
1989 min(ioc
->reply_sz
, 4 * reply
->u
.reply
.MsgLength
));
1992 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_PENDING
) {
1993 ioc
->sas_mgmt
.status
&= ~MPT_MGMT_STATUS_PENDING
;
1994 complete(&ioc
->sas_mgmt
.done
);
2000 static int mptsas_phy_reset(struct sas_phy
*phy
, int hard_reset
)
2002 MPT_ADAPTER
*ioc
= phy_to_ioc(phy
);
2003 SasIoUnitControlRequest_t
*req
;
2004 SasIoUnitControlReply_t
*reply
;
2007 unsigned long timeleft
;
2008 int error
= -ERESTARTSYS
;
2010 /* FIXME: fusion doesn't allow non-local phy reset */
2011 if (!scsi_is_sas_phy_local(phy
))
2014 /* not implemented for expanders */
2015 if (phy
->identify
.target_port_protocols
& SAS_PROTOCOL_SMP
)
2018 if (mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
))
2021 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2027 hdr
= (MPIHeader_t
*) mf
;
2028 req
= (SasIoUnitControlRequest_t
*)mf
;
2029 memset(req
, 0, sizeof(SasIoUnitControlRequest_t
));
2030 req
->Function
= MPI_FUNCTION_SAS_IO_UNIT_CONTROL
;
2031 req
->MsgContext
= hdr
->MsgContext
;
2032 req
->Operation
= hard_reset
?
2033 MPI_SAS_OP_PHY_HARD_RESET
: MPI_SAS_OP_PHY_LINK_RESET
;
2034 req
->PhyNum
= phy
->identify
.phy_identifier
;
2036 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2037 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2039 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
,
2041 if (!(ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
2043 mpt_free_msg_frame(ioc
, mf
);
2044 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
2047 mpt_Soft_Hard_ResetHandler(ioc
, CAN_SLEEP
);
2051 /* a reply frame is expected */
2052 if ((ioc
->sas_mgmt
.status
&
2053 MPT_MGMT_STATUS_RF_VALID
) == 0) {
2058 /* process the completed Reply Message Frame */
2059 reply
= (SasIoUnitControlReply_t
*)ioc
->sas_mgmt
.reply
;
2060 if (reply
->IOCStatus
!= MPI_IOCSTATUS_SUCCESS
) {
2061 printk(MYIOC_s_INFO_FMT
"%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
2062 ioc
->name
, __func__
, reply
->IOCStatus
, reply
->IOCLogInfo
);
2070 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2071 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2077 mptsas_get_enclosure_identifier(struct sas_rphy
*rphy
, u64
*identifier
)
2079 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2081 struct mptsas_portinfo
*p
;
2082 struct mptsas_enclosure enclosure_info
;
2083 u64 enclosure_handle
;
2085 mutex_lock(&ioc
->sas_topology_mutex
);
2086 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2087 for (i
= 0; i
< p
->num_phys
; i
++) {
2088 if (p
->phy_info
[i
].attached
.sas_address
==
2089 rphy
->identify
.sas_address
) {
2090 enclosure_handle
= p
->phy_info
[i
].
2091 attached
.handle_enclosure
;
2096 mutex_unlock(&ioc
->sas_topology_mutex
);
2100 mutex_unlock(&ioc
->sas_topology_mutex
);
2101 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
2102 error
= mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
2103 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
2104 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
), enclosure_handle
);
2106 *identifier
= enclosure_info
.enclosure_logical_id
;
2111 mptsas_get_bay_identifier(struct sas_rphy
*rphy
)
2113 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2114 struct mptsas_portinfo
*p
;
2117 mutex_lock(&ioc
->sas_topology_mutex
);
2118 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2119 for (i
= 0; i
< p
->num_phys
; i
++) {
2120 if (p
->phy_info
[i
].attached
.sas_address
==
2121 rphy
->identify
.sas_address
) {
2122 rc
= p
->phy_info
[i
].attached
.slot
;
2129 mutex_unlock(&ioc
->sas_topology_mutex
);
2133 static int mptsas_smp_handler(struct Scsi_Host
*shost
, struct sas_rphy
*rphy
,
2134 struct request
*req
)
2136 MPT_ADAPTER
*ioc
= ((MPT_SCSI_HOST
*) shost
->hostdata
)->ioc
;
2138 SmpPassthroughRequest_t
*smpreq
;
2139 struct request
*rsp
= req
->next_rq
;
2142 unsigned long timeleft
;
2144 dma_addr_t dma_addr_in
= 0;
2145 dma_addr_t dma_addr_out
= 0;
2146 u64 sas_address
= 0;
2149 printk(MYIOC_s_ERR_FMT
"%s: the smp response space is missing\n",
2150 ioc
->name
, __func__
);
2154 /* do we need to support multiple segments? */
2155 if (req
->bio
->bi_vcnt
> 1 || rsp
->bio
->bi_vcnt
> 1) {
2156 printk(MYIOC_s_ERR_FMT
"%s: multiple segments req %u %u, rsp %u %u\n",
2157 ioc
->name
, __func__
, req
->bio
->bi_vcnt
, blk_rq_bytes(req
),
2158 rsp
->bio
->bi_vcnt
, blk_rq_bytes(rsp
));
2162 ret
= mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
);
2166 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2172 smpreq
= (SmpPassthroughRequest_t
*)mf
;
2173 memset(smpreq
, 0, sizeof(*smpreq
));
2175 smpreq
->RequestDataLength
= cpu_to_le16(blk_rq_bytes(req
) - 4);
2176 smpreq
->Function
= MPI_FUNCTION_SMP_PASSTHROUGH
;
2179 sas_address
= rphy
->identify
.sas_address
;
2181 struct mptsas_portinfo
*port_info
;
2183 mutex_lock(&ioc
->sas_topology_mutex
);
2184 port_info
= ioc
->hba_port_info
;
2185 if (port_info
&& port_info
->phy_info
)
2187 port_info
->phy_info
[0].phy
->identify
.sas_address
;
2188 mutex_unlock(&ioc
->sas_topology_mutex
);
2191 *((u64
*)&smpreq
->SASAddress
) = cpu_to_le64(sas_address
);
2194 (((int *) mf
) + (offsetof(SmpPassthroughRequest_t
, SGL
) / 4));
2197 flagsLength
= (MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2198 MPI_SGE_FLAGS_END_OF_BUFFER
|
2199 MPI_SGE_FLAGS_DIRECTION
)
2200 << MPI_SGE_FLAGS_SHIFT
;
2201 flagsLength
|= (blk_rq_bytes(req
) - 4);
2203 dma_addr_out
= pci_map_single(ioc
->pcidev
, bio_data(req
->bio
),
2204 blk_rq_bytes(req
), PCI_DMA_BIDIRECTIONAL
);
2207 ioc
->add_sge(psge
, flagsLength
, dma_addr_out
);
2208 psge
+= ioc
->SGE_size
;
2211 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2212 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2213 MPI_SGE_FLAGS_IOC_TO_HOST
|
2214 MPI_SGE_FLAGS_END_OF_BUFFER
;
2216 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2217 flagsLength
|= blk_rq_bytes(rsp
) + 4;
2218 dma_addr_in
= pci_map_single(ioc
->pcidev
, bio_data(rsp
->bio
),
2219 blk_rq_bytes(rsp
), PCI_DMA_BIDIRECTIONAL
);
2222 ioc
->add_sge(psge
, flagsLength
, dma_addr_in
);
2224 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2225 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2227 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
, 10 * HZ
);
2228 if (!(ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
2230 mpt_free_msg_frame(ioc
, mf
);
2232 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
2235 mpt_Soft_Hard_ResetHandler(ioc
, CAN_SLEEP
);
2240 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_RF_VALID
) {
2241 SmpPassthroughReply_t
*smprep
;
2243 smprep
= (SmpPassthroughReply_t
*)ioc
->sas_mgmt
.reply
;
2244 memcpy(req
->sense
, smprep
, sizeof(*smprep
));
2245 req
->sense_len
= sizeof(*smprep
);
2247 rsp
->resid_len
-= smprep
->ResponseDataLength
;
2249 printk(MYIOC_s_ERR_FMT
2250 "%s: smp passthru reply failed to be returned\n",
2251 ioc
->name
, __func__
);
2256 pci_unmap_single(ioc
->pcidev
, dma_addr_out
, blk_rq_bytes(req
),
2257 PCI_DMA_BIDIRECTIONAL
);
2259 pci_unmap_single(ioc
->pcidev
, dma_addr_in
, blk_rq_bytes(rsp
),
2260 PCI_DMA_BIDIRECTIONAL
);
2263 mpt_free_msg_frame(ioc
, mf
);
2265 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2266 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2271 static struct sas_function_template mptsas_transport_functions
= {
2272 .get_linkerrors
= mptsas_get_linkerrors
,
2273 .get_enclosure_identifier
= mptsas_get_enclosure_identifier
,
2274 .get_bay_identifier
= mptsas_get_bay_identifier
,
2275 .phy_reset
= mptsas_phy_reset
,
2276 .smp_handler
= mptsas_smp_handler
,
2279 static struct scsi_transport_template
*mptsas_transport_template
;
2282 mptsas_sas_io_unit_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
2284 ConfigExtendedPageHeader_t hdr
;
2286 SasIOUnitPage0_t
*buffer
;
2287 dma_addr_t dma_handle
;
2290 hdr
.PageVersion
= MPI_SASIOUNITPAGE0_PAGEVERSION
;
2291 hdr
.ExtPageLength
= 0;
2295 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2296 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2298 cfg
.cfghdr
.ehdr
= &hdr
;
2301 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2302 cfg
.dir
= 0; /* read */
2303 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2305 error
= mpt_config(ioc
, &cfg
);
2308 if (!hdr
.ExtPageLength
) {
2313 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2320 cfg
.physAddr
= dma_handle
;
2321 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2323 error
= mpt_config(ioc
, &cfg
);
2325 goto out_free_consistent
;
2327 port_info
->num_phys
= buffer
->NumPhys
;
2328 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2329 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2330 if (!port_info
->phy_info
) {
2332 goto out_free_consistent
;
2335 ioc
->nvdata_version_persistent
=
2336 le16_to_cpu(buffer
->NvdataVersionPersistent
);
2337 ioc
->nvdata_version_default
=
2338 le16_to_cpu(buffer
->NvdataVersionDefault
);
2340 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2341 mptsas_print_phy_data(ioc
, &buffer
->PhyData
[i
]);
2342 port_info
->phy_info
[i
].phy_id
= i
;
2343 port_info
->phy_info
[i
].port_id
=
2344 buffer
->PhyData
[i
].Port
;
2345 port_info
->phy_info
[i
].negotiated_link_rate
=
2346 buffer
->PhyData
[i
].NegotiatedLinkRate
;
2347 port_info
->phy_info
[i
].portinfo
= port_info
;
2348 port_info
->phy_info
[i
].handle
=
2349 le16_to_cpu(buffer
->PhyData
[i
].ControllerDevHandle
);
2352 out_free_consistent
:
2353 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2354 buffer
, dma_handle
);
2360 mptsas_sas_io_unit_pg1(MPT_ADAPTER
*ioc
)
2362 ConfigExtendedPageHeader_t hdr
;
2364 SasIOUnitPage1_t
*buffer
;
2365 dma_addr_t dma_handle
;
2367 u16 device_missing_delay
;
2369 memset(&hdr
, 0, sizeof(ConfigExtendedPageHeader_t
));
2370 memset(&cfg
, 0, sizeof(CONFIGPARMS
));
2372 cfg
.cfghdr
.ehdr
= &hdr
;
2373 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2374 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2375 cfg
.cfghdr
.ehdr
->PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2376 cfg
.cfghdr
.ehdr
->ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2377 cfg
.cfghdr
.ehdr
->PageVersion
= MPI_SASIOUNITPAGE1_PAGEVERSION
;
2378 cfg
.cfghdr
.ehdr
->PageNumber
= 1;
2380 error
= mpt_config(ioc
, &cfg
);
2383 if (!hdr
.ExtPageLength
) {
2388 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2395 cfg
.physAddr
= dma_handle
;
2396 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2398 error
= mpt_config(ioc
, &cfg
);
2400 goto out_free_consistent
;
2402 ioc
->io_missing_delay
=
2403 le16_to_cpu(buffer
->IODeviceMissingDelay
);
2404 device_missing_delay
= le16_to_cpu(buffer
->ReportDeviceMissingDelay
);
2405 ioc
->device_missing_delay
= (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16
) ?
2406 (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
) * 16 :
2407 device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
;
2409 out_free_consistent
:
2410 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2411 buffer
, dma_handle
);
2417 mptsas_sas_phy_pg0(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2418 u32 form
, u32 form_specific
)
2420 ConfigExtendedPageHeader_t hdr
;
2422 SasPhyPage0_t
*buffer
;
2423 dma_addr_t dma_handle
;
2426 hdr
.PageVersion
= MPI_SASPHY0_PAGEVERSION
;
2427 hdr
.ExtPageLength
= 0;
2431 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2432 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_PHY
;
2434 cfg
.cfghdr
.ehdr
= &hdr
;
2435 cfg
.dir
= 0; /* read */
2436 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2438 /* Get Phy Pg 0 for each Phy. */
2440 cfg
.pageAddr
= form
+ form_specific
;
2441 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2443 error
= mpt_config(ioc
, &cfg
);
2447 if (!hdr
.ExtPageLength
) {
2452 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2459 cfg
.physAddr
= dma_handle
;
2460 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2462 error
= mpt_config(ioc
, &cfg
);
2464 goto out_free_consistent
;
2466 mptsas_print_phy_pg0(ioc
, buffer
);
2468 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2469 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2470 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2471 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2473 out_free_consistent
:
2474 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2475 buffer
, dma_handle
);
2481 mptsas_sas_device_pg0(MPT_ADAPTER
*ioc
, struct mptsas_devinfo
*device_info
,
2482 u32 form
, u32 form_specific
)
2484 ConfigExtendedPageHeader_t hdr
;
2486 SasDevicePage0_t
*buffer
;
2487 dma_addr_t dma_handle
;
2491 hdr
.PageVersion
= MPI_SASDEVICE0_PAGEVERSION
;
2492 hdr
.ExtPageLength
= 0;
2496 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2497 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE
;
2499 cfg
.cfghdr
.ehdr
= &hdr
;
2500 cfg
.pageAddr
= form
+ form_specific
;
2502 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2503 cfg
.dir
= 0; /* read */
2504 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2506 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2507 error
= mpt_config(ioc
, &cfg
);
2510 if (!hdr
.ExtPageLength
) {
2515 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2522 cfg
.physAddr
= dma_handle
;
2523 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2525 error
= mpt_config(ioc
, &cfg
);
2527 if (error
== MPI_IOCSTATUS_CONFIG_INVALID_PAGE
) {
2529 goto out_free_consistent
;
2533 goto out_free_consistent
;
2535 mptsas_print_device_pg0(ioc
, buffer
);
2537 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2538 device_info
->handle
= le16_to_cpu(buffer
->DevHandle
);
2539 device_info
->handle_parent
= le16_to_cpu(buffer
->ParentDevHandle
);
2540 device_info
->handle_enclosure
=
2541 le16_to_cpu(buffer
->EnclosureHandle
);
2542 device_info
->slot
= le16_to_cpu(buffer
->Slot
);
2543 device_info
->phy_id
= buffer
->PhyNum
;
2544 device_info
->port_id
= buffer
->PhysicalPort
;
2545 device_info
->id
= buffer
->TargetID
;
2546 device_info
->phys_disk_num
= ~0;
2547 device_info
->channel
= buffer
->Bus
;
2548 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2549 device_info
->sas_address
= le64_to_cpu(sas_address
);
2550 device_info
->device_info
=
2551 le32_to_cpu(buffer
->DeviceInfo
);
2553 out_free_consistent
:
2554 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2555 buffer
, dma_handle
);
2561 mptsas_sas_expander_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
,
2562 u32 form
, u32 form_specific
)
2564 ConfigExtendedPageHeader_t hdr
;
2566 SasExpanderPage0_t
*buffer
;
2567 dma_addr_t dma_handle
;
2571 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2572 hdr
.PageVersion
= MPI_SASEXPANDER0_PAGEVERSION
;
2573 hdr
.ExtPageLength
= 0;
2577 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2578 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2580 cfg
.cfghdr
.ehdr
= &hdr
;
2582 cfg
.pageAddr
= form
+ form_specific
;
2583 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2584 cfg
.dir
= 0; /* read */
2585 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2587 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2588 error
= mpt_config(ioc
, &cfg
);
2592 if (!hdr
.ExtPageLength
) {
2597 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2604 cfg
.physAddr
= dma_handle
;
2605 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2607 error
= mpt_config(ioc
, &cfg
);
2608 if (error
== MPI_IOCSTATUS_CONFIG_INVALID_PAGE
) {
2610 goto out_free_consistent
;
2614 goto out_free_consistent
;
2616 /* save config data */
2617 port_info
->num_phys
= (buffer
->NumPhys
) ? buffer
->NumPhys
: 1;
2618 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2619 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2620 if (!port_info
->phy_info
) {
2622 goto out_free_consistent
;
2625 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2626 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2627 port_info
->phy_info
[i
].portinfo
= port_info
;
2628 port_info
->phy_info
[i
].handle
=
2629 le16_to_cpu(buffer
->DevHandle
);
2630 port_info
->phy_info
[i
].identify
.sas_address
=
2631 le64_to_cpu(sas_address
);
2632 port_info
->phy_info
[i
].identify
.handle_parent
=
2633 le16_to_cpu(buffer
->ParentDevHandle
);
2636 out_free_consistent
:
2637 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2638 buffer
, dma_handle
);
2644 mptsas_sas_expander_pg1(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2645 u32 form
, u32 form_specific
)
2647 ConfigExtendedPageHeader_t hdr
;
2649 SasExpanderPage1_t
*buffer
;
2650 dma_addr_t dma_handle
;
2653 hdr
.PageVersion
= MPI_SASEXPANDER1_PAGEVERSION
;
2654 hdr
.ExtPageLength
= 0;
2658 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2659 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2661 cfg
.cfghdr
.ehdr
= &hdr
;
2663 cfg
.pageAddr
= form
+ form_specific
;
2664 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2665 cfg
.dir
= 0; /* read */
2666 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2668 error
= mpt_config(ioc
, &cfg
);
2672 if (!hdr
.ExtPageLength
) {
2677 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2684 cfg
.physAddr
= dma_handle
;
2685 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2687 error
= mpt_config(ioc
, &cfg
);
2689 if (error
== MPI_IOCSTATUS_CONFIG_INVALID_PAGE
) {
2691 goto out_free_consistent
;
2695 goto out_free_consistent
;
2698 mptsas_print_expander_pg1(ioc
, buffer
);
2700 /* save config data */
2701 phy_info
->phy_id
= buffer
->PhyIdentifier
;
2702 phy_info
->port_id
= buffer
->PhysicalPort
;
2703 phy_info
->negotiated_link_rate
= buffer
->NegotiatedLinkRate
;
2704 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2705 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2706 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2707 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2709 out_free_consistent
:
2710 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2711 buffer
, dma_handle
);
2716 struct rep_manu_request
{
2723 struct rep_manu_reply
{
2724 u8 smp_frame_type
; /* 0x41 */
2725 u8 function
; /* 0x01 */
2728 u16 expander_change_count
;
2733 u8 vendor_id
[SAS_EXPANDER_VENDOR_ID_LEN
];
2734 u8 product_id
[SAS_EXPANDER_PRODUCT_ID_LEN
];
2735 u8 product_rev
[SAS_EXPANDER_PRODUCT_REV_LEN
];
2736 u8 component_vendor_id
[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN
];
2738 u8 component_revision_id
;
2740 u8 vendor_specific
[8];
2744 * mptsas_exp_repmanufacture_info -
2745 * @ioc: per adapter object
2746 * @sas_address: expander sas address
2747 * @edev: the sas_expander_device object
2749 * Fills in the sas_expander_device object when SMP port is created.
2751 * Returns 0 for success, non-zero for failure.
2754 mptsas_exp_repmanufacture_info(MPT_ADAPTER
*ioc
,
2755 u64 sas_address
, struct sas_expander_device
*edev
)
2758 SmpPassthroughRequest_t
*smpreq
;
2759 SmpPassthroughReply_t
*smprep
;
2760 struct rep_manu_reply
*manufacture_reply
;
2761 struct rep_manu_request
*manufacture_request
;
2764 unsigned long timeleft
;
2766 unsigned long flags
;
2767 void *data_out
= NULL
;
2768 dma_addr_t data_out_dma
= 0;
2771 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
2772 if (ioc
->ioc_reset_in_progress
) {
2773 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
2774 printk(MYIOC_s_INFO_FMT
"%s: host reset in progress!\n",
2775 __func__
, ioc
->name
);
2778 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
2780 ret
= mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
);
2784 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2790 smpreq
= (SmpPassthroughRequest_t
*)mf
;
2791 memset(smpreq
, 0, sizeof(*smpreq
));
2793 sz
= sizeof(struct rep_manu_request
) + sizeof(struct rep_manu_reply
);
2795 data_out
= pci_alloc_consistent(ioc
->pcidev
, sz
, &data_out_dma
);
2797 printk(KERN_ERR
"Memory allocation failure at %s:%d/%s()!\n",
2798 __FILE__
, __LINE__
, __func__
);
2803 manufacture_request
= data_out
;
2804 manufacture_request
->smp_frame_type
= 0x40;
2805 manufacture_request
->function
= 1;
2806 manufacture_request
->reserved
= 0;
2807 manufacture_request
->request_length
= 0;
2809 smpreq
->Function
= MPI_FUNCTION_SMP_PASSTHROUGH
;
2810 smpreq
->PhysicalPort
= 0xFF;
2811 *((u64
*)&smpreq
->SASAddress
) = cpu_to_le64(sas_address
);
2812 smpreq
->RequestDataLength
= sizeof(struct rep_manu_request
);
2815 (((int *) mf
) + (offsetof(SmpPassthroughRequest_t
, SGL
) / 4));
2817 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2818 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2819 MPI_SGE_FLAGS_HOST_TO_IOC
|
2820 MPI_SGE_FLAGS_END_OF_BUFFER
;
2821 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2822 flagsLength
|= sizeof(struct rep_manu_request
);
2824 ioc
->add_sge(psge
, flagsLength
, data_out_dma
);
2825 psge
+= ioc
->SGE_size
;
2827 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2828 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2829 MPI_SGE_FLAGS_IOC_TO_HOST
|
2830 MPI_SGE_FLAGS_END_OF_BUFFER
;
2831 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2832 flagsLength
|= sizeof(struct rep_manu_reply
);
2833 ioc
->add_sge(psge
, flagsLength
, data_out_dma
+
2834 sizeof(struct rep_manu_request
));
2836 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2837 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2839 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
, 10 * HZ
);
2840 if (!(ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
2842 mpt_free_msg_frame(ioc
, mf
);
2844 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
2847 mpt_Soft_Hard_ResetHandler(ioc
, CAN_SLEEP
);
2853 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_RF_VALID
) {
2856 smprep
= (SmpPassthroughReply_t
*)ioc
->sas_mgmt
.reply
;
2857 if (le16_to_cpu(smprep
->ResponseDataLength
) !=
2858 sizeof(struct rep_manu_reply
))
2861 manufacture_reply
= data_out
+ sizeof(struct rep_manu_request
);
2862 strncpy(edev
->vendor_id
, manufacture_reply
->vendor_id
,
2863 SAS_EXPANDER_VENDOR_ID_LEN
);
2864 strncpy(edev
->product_id
, manufacture_reply
->product_id
,
2865 SAS_EXPANDER_PRODUCT_ID_LEN
);
2866 strncpy(edev
->product_rev
, manufacture_reply
->product_rev
,
2867 SAS_EXPANDER_PRODUCT_REV_LEN
);
2868 edev
->level
= manufacture_reply
->sas_format
;
2869 if (manufacture_reply
->sas_format
) {
2870 strncpy(edev
->component_vendor_id
,
2871 manufacture_reply
->component_vendor_id
,
2872 SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN
);
2873 tmp
= (u8
*)&manufacture_reply
->component_id
;
2874 edev
->component_id
= tmp
[0] << 8 | tmp
[1];
2875 edev
->component_revision_id
=
2876 manufacture_reply
->component_revision_id
;
2879 printk(MYIOC_s_ERR_FMT
2880 "%s: smp passthru reply failed to be returned\n",
2881 ioc
->name
, __func__
);
2886 pci_free_consistent(ioc
->pcidev
, sz
, data_out
, data_out_dma
);
2889 mpt_free_msg_frame(ioc
, mf
);
2891 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2892 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2898 mptsas_parse_device_info(struct sas_identify
*identify
,
2899 struct mptsas_devinfo
*device_info
)
2903 identify
->sas_address
= device_info
->sas_address
;
2904 identify
->phy_identifier
= device_info
->phy_id
;
2907 * Fill in Phy Initiator Port Protocol.
2908 * Bits 6:3, more than one bit can be set, fall through cases.
2910 protocols
= device_info
->device_info
& 0x78;
2911 identify
->initiator_port_protocols
= 0;
2912 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_INITIATOR
)
2913 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SSP
;
2914 if (protocols
& MPI_SAS_DEVICE_INFO_STP_INITIATOR
)
2915 identify
->initiator_port_protocols
|= SAS_PROTOCOL_STP
;
2916 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_INITIATOR
)
2917 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SMP
;
2918 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_HOST
)
2919 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SATA
;
2922 * Fill in Phy Target Port Protocol.
2923 * Bits 10:7, more than one bit can be set, fall through cases.
2925 protocols
= device_info
->device_info
& 0x780;
2926 identify
->target_port_protocols
= 0;
2927 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_TARGET
)
2928 identify
->target_port_protocols
|= SAS_PROTOCOL_SSP
;
2929 if (protocols
& MPI_SAS_DEVICE_INFO_STP_TARGET
)
2930 identify
->target_port_protocols
|= SAS_PROTOCOL_STP
;
2931 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_TARGET
)
2932 identify
->target_port_protocols
|= SAS_PROTOCOL_SMP
;
2933 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
2934 identify
->target_port_protocols
|= SAS_PROTOCOL_SATA
;
2937 * Fill in Attached device type.
2939 switch (device_info
->device_info
&
2940 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE
) {
2941 case MPI_SAS_DEVICE_INFO_NO_DEVICE
:
2942 identify
->device_type
= SAS_PHY_UNUSED
;
2944 case MPI_SAS_DEVICE_INFO_END_DEVICE
:
2945 identify
->device_type
= SAS_END_DEVICE
;
2947 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
:
2948 identify
->device_type
= SAS_EDGE_EXPANDER_DEVICE
;
2950 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
:
2951 identify
->device_type
= SAS_FANOUT_EXPANDER_DEVICE
;
2956 static int mptsas_probe_one_phy(struct device
*dev
,
2957 struct mptsas_phyinfo
*phy_info
, int index
, int local
)
2960 struct sas_phy
*phy
;
2961 struct sas_port
*port
;
2969 if (!phy_info
->phy
) {
2970 phy
= sas_phy_alloc(dev
, index
);
2976 phy
= phy_info
->phy
;
2978 mptsas_parse_device_info(&phy
->identify
, &phy_info
->identify
);
2981 * Set Negotiated link rate.
2983 switch (phy_info
->negotiated_link_rate
) {
2984 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
:
2985 phy
->negotiated_linkrate
= SAS_PHY_DISABLED
;
2987 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
:
2988 phy
->negotiated_linkrate
= SAS_LINK_RATE_FAILED
;
2990 case MPI_SAS_IOUNIT0_RATE_1_5
:
2991 phy
->negotiated_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
2993 case MPI_SAS_IOUNIT0_RATE_3_0
:
2994 phy
->negotiated_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
2996 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE
:
2997 case MPI_SAS_IOUNIT0_RATE_UNKNOWN
:
2999 phy
->negotiated_linkrate
= SAS_LINK_RATE_UNKNOWN
;
3004 * Set Max hardware link rate.
3006 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
3007 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5
:
3008 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
3010 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
3011 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
3018 * Set Max programmed link rate.
3020 switch (phy_info
->programmed_link_rate
&
3021 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
3022 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5
:
3023 phy
->maximum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
3025 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
3026 phy
->maximum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
3033 * Set Min hardware link rate.
3035 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK
) {
3036 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5
:
3037 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
3039 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
3040 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
3047 * Set Min programmed link rate.
3049 switch (phy_info
->programmed_link_rate
&
3050 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK
) {
3051 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5
:
3052 phy
->minimum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
3054 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
3055 phy
->minimum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
3061 if (!phy_info
->phy
) {
3063 error
= sas_phy_add(phy
);
3068 phy_info
->phy
= phy
;
3071 if (!phy_info
->attached
.handle
||
3072 !phy_info
->port_details
)
3075 port
= mptsas_get_port(phy_info
);
3076 ioc
= phy_to_ioc(phy_info
->phy
);
3078 if (phy_info
->sas_port_add_phy
) {
3081 port
= sas_port_alloc_num(dev
);
3086 error
= sas_port_add(port
);
3088 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3089 "%s: exit at line=%d\n", ioc
->name
,
3090 __func__
, __LINE__
));
3093 mptsas_set_port(ioc
, phy_info
, port
);
3094 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &port
->dev
,
3095 MYIOC_s_FMT
"add port %d, sas_addr (0x%llx)\n",
3096 ioc
->name
, port
->port_identifier
,
3097 (unsigned long long)phy_info
->
3098 attached
.sas_address
));
3100 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3101 "sas_port_add_phy: phy_id=%d\n",
3102 ioc
->name
, phy_info
->phy_id
));
3103 sas_port_add_phy(port
, phy_info
->phy
);
3104 phy_info
->sas_port_add_phy
= 0;
3105 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
3106 MYIOC_s_FMT
"add phy %d, phy-obj (0x%p)\n", ioc
->name
,
3107 phy_info
->phy_id
, phy_info
->phy
));
3109 if (!mptsas_get_rphy(phy_info
) && port
&& !port
->rphy
) {
3111 struct sas_rphy
*rphy
;
3112 struct device
*parent
;
3113 struct sas_identify identify
;
3115 parent
= dev
->parent
->parent
;
3117 * Let the hotplug_work thread handle processing
3118 * the adding/removing of devices that occur
3119 * after start of day.
3121 if (mptsas_is_end_device(&phy_info
->attached
) &&
3122 phy_info
->attached
.handle_parent
) {
3126 mptsas_parse_device_info(&identify
, &phy_info
->attached
);
3127 if (scsi_is_host_device(parent
)) {
3128 struct mptsas_portinfo
*port_info
;
3131 port_info
= ioc
->hba_port_info
;
3133 for (i
= 0; i
< port_info
->num_phys
; i
++)
3134 if (port_info
->phy_info
[i
].identify
.sas_address
==
3135 identify
.sas_address
) {
3136 sas_port_mark_backlink(port
);
3140 } else if (scsi_is_sas_rphy(parent
)) {
3141 struct sas_rphy
*parent_rphy
= dev_to_rphy(parent
);
3142 if (identify
.sas_address
==
3143 parent_rphy
->identify
.sas_address
) {
3144 sas_port_mark_backlink(port
);
3149 switch (identify
.device_type
) {
3150 case SAS_END_DEVICE
:
3151 rphy
= sas_end_device_alloc(port
);
3153 case SAS_EDGE_EXPANDER_DEVICE
:
3154 case SAS_FANOUT_EXPANDER_DEVICE
:
3155 rphy
= sas_expander_alloc(port
, identify
.device_type
);
3162 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3163 "%s: exit at line=%d\n", ioc
->name
,
3164 __func__
, __LINE__
));
3168 rphy
->identify
= identify
;
3169 error
= sas_rphy_add(rphy
);
3171 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3172 "%s: exit at line=%d\n", ioc
->name
,
3173 __func__
, __LINE__
));
3174 sas_rphy_free(rphy
);
3177 mptsas_set_rphy(ioc
, phy_info
, rphy
);
3178 if (identify
.device_type
== SAS_EDGE_EXPANDER_DEVICE
||
3179 identify
.device_type
== SAS_FANOUT_EXPANDER_DEVICE
)
3180 mptsas_exp_repmanufacture_info(ioc
,
3181 identify
.sas_address
,
3182 rphy_to_expander_device(rphy
));
3190 mptsas_probe_hba_phys(MPT_ADAPTER
*ioc
)
3192 struct mptsas_portinfo
*port_info
, *hba
;
3193 int error
= -ENOMEM
, i
;
3195 hba
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3199 error
= mptsas_sas_io_unit_pg0(ioc
, hba
);
3201 goto out_free_port_info
;
3203 mptsas_sas_io_unit_pg1(ioc
);
3204 mutex_lock(&ioc
->sas_topology_mutex
);
3205 port_info
= ioc
->hba_port_info
;
3207 ioc
->hba_port_info
= port_info
= hba
;
3208 ioc
->hba_port_num_phy
= port_info
->num_phys
;
3209 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3211 for (i
= 0; i
< hba
->num_phys
; i
++) {
3212 port_info
->phy_info
[i
].negotiated_link_rate
=
3213 hba
->phy_info
[i
].negotiated_link_rate
;
3214 port_info
->phy_info
[i
].handle
=
3215 hba
->phy_info
[i
].handle
;
3216 port_info
->phy_info
[i
].port_id
=
3217 hba
->phy_info
[i
].port_id
;
3219 kfree(hba
->phy_info
);
3223 mutex_unlock(&ioc
->sas_topology_mutex
);
3224 #if defined(CPQ_CIM)
3225 ioc
->num_ports
= port_info
->num_phys
;
3227 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3228 mptsas_sas_phy_pg0(ioc
, &port_info
->phy_info
[i
],
3229 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER
<<
3230 MPI_SAS_PHY_PGAD_FORM_SHIFT
), i
);
3231 port_info
->phy_info
[i
].identify
.handle
=
3232 port_info
->phy_info
[i
].handle
;
3233 mptsas_sas_device_pg0(ioc
, &port_info
->phy_info
[i
].identify
,
3234 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3235 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3236 port_info
->phy_info
[i
].identify
.handle
);
3237 if (!ioc
->hba_port_sas_addr
)
3238 ioc
->hba_port_sas_addr
=
3239 port_info
->phy_info
[i
].identify
.sas_address
;
3240 port_info
->phy_info
[i
].identify
.phy_id
=
3241 port_info
->phy_info
[i
].phy_id
= i
;
3242 if (port_info
->phy_info
[i
].attached
.handle
)
3243 mptsas_sas_device_pg0(ioc
,
3244 &port_info
->phy_info
[i
].attached
,
3245 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3246 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3247 port_info
->phy_info
[i
].attached
.handle
);
3250 mptsas_setup_wide_ports(ioc
, port_info
);
3252 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3253 mptsas_probe_one_phy(&ioc
->sh
->shost_gendev
,
3254 &port_info
->phy_info
[i
], ioc
->sas_index
, 1);
3265 mptsas_expander_refresh(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
3267 struct mptsas_portinfo
*parent
;
3268 struct device
*parent_dev
;
3269 struct sas_rphy
*rphy
;
3271 u64 sas_address
; /* expander sas address */
3274 handle
= port_info
->phy_info
[0].handle
;
3275 sas_address
= port_info
->phy_info
[0].identify
.sas_address
;
3276 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3277 mptsas_sas_expander_pg1(ioc
, &port_info
->phy_info
[i
],
3278 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM
<<
3279 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), (i
<< 16) + handle
);
3281 mptsas_sas_device_pg0(ioc
,
3282 &port_info
->phy_info
[i
].identify
,
3283 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3284 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3285 port_info
->phy_info
[i
].identify
.handle
);
3286 port_info
->phy_info
[i
].identify
.phy_id
=
3287 port_info
->phy_info
[i
].phy_id
;
3289 if (port_info
->phy_info
[i
].attached
.handle
) {
3290 mptsas_sas_device_pg0(ioc
,
3291 &port_info
->phy_info
[i
].attached
,
3292 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3293 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3294 port_info
->phy_info
[i
].attached
.handle
);
3295 port_info
->phy_info
[i
].attached
.phy_id
=
3296 port_info
->phy_info
[i
].phy_id
;
3300 mutex_lock(&ioc
->sas_topology_mutex
);
3301 parent
= mptsas_find_portinfo_by_handle(ioc
,
3302 port_info
->phy_info
[0].identify
.handle_parent
);
3304 mutex_unlock(&ioc
->sas_topology_mutex
);
3307 for (i
= 0, parent_dev
= NULL
; i
< parent
->num_phys
&& !parent_dev
;
3309 if (parent
->phy_info
[i
].attached
.sas_address
== sas_address
) {
3310 rphy
= mptsas_get_rphy(&parent
->phy_info
[i
]);
3311 parent_dev
= &rphy
->dev
;
3314 mutex_unlock(&ioc
->sas_topology_mutex
);
3316 mptsas_setup_wide_ports(ioc
, port_info
);
3317 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3318 mptsas_probe_one_phy(parent_dev
, &port_info
->phy_info
[i
],
3323 mptsas_expander_event_add(MPT_ADAPTER
*ioc
,
3324 MpiEventDataSasExpanderStatusChange_t
*expander_data
)
3326 struct mptsas_portinfo
*port_info
;
3330 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3333 port_info
->num_phys
= (expander_data
->NumPhys
) ?
3334 expander_data
->NumPhys
: 1;
3335 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
3336 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
3337 if (!port_info
->phy_info
)
3339 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3340 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3341 port_info
->phy_info
[i
].portinfo
= port_info
;
3342 port_info
->phy_info
[i
].handle
=
3343 le16_to_cpu(expander_data
->DevHandle
);
3344 port_info
->phy_info
[i
].identify
.sas_address
=
3345 le64_to_cpu(sas_address
);
3346 port_info
->phy_info
[i
].identify
.handle_parent
=
3347 le16_to_cpu(expander_data
->ParentDevHandle
);
3350 mutex_lock(&ioc
->sas_topology_mutex
);
3351 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3352 mutex_unlock(&ioc
->sas_topology_mutex
);
3354 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3355 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3356 (unsigned long long)sas_address
);
3358 mptsas_expander_refresh(ioc
, port_info
);
3362 * mptsas_delete_expander_siblings - remove siblings attached to expander
3363 * @ioc: Pointer to MPT_ADAPTER structure
3364 * @parent: the parent port_info object
3365 * @expander: the expander port_info object
3368 mptsas_delete_expander_siblings(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
3369 *parent
, struct mptsas_portinfo
*expander
)
3371 struct mptsas_phyinfo
*phy_info
;
3372 struct mptsas_portinfo
*port_info
;
3373 struct sas_rphy
*rphy
;
3376 phy_info
= expander
->phy_info
;
3377 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3378 rphy
= mptsas_get_rphy(phy_info
);
3381 if (rphy
->identify
.device_type
== SAS_END_DEVICE
)
3382 mptsas_del_end_device(ioc
, phy_info
);
3385 phy_info
= expander
->phy_info
;
3386 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3387 rphy
= mptsas_get_rphy(phy_info
);
3390 if (rphy
->identify
.device_type
==
3391 MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
||
3392 rphy
->identify
.device_type
==
3393 MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
) {
3394 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3395 rphy
->identify
.sas_address
);
3398 if (port_info
== parent
) /* backlink rphy */
3401 Delete this expander even if the expdevpage is exists
3402 because the parent expander is already deleted
3404 mptsas_expander_delete(ioc
, port_info
, 1);
3411 * mptsas_expander_delete - remove this expander
3412 * @ioc: Pointer to MPT_ADAPTER structure
3413 * @port_info: expander port_info struct
3414 * @force: Flag to forcefully delete the expander
3418 static void mptsas_expander_delete(MPT_ADAPTER
*ioc
,
3419 struct mptsas_portinfo
*port_info
, u8 force
)
3422 struct mptsas_portinfo
*parent
;
3424 u64 expander_sas_address
;
3425 struct mptsas_phyinfo
*phy_info
;
3426 struct mptsas_portinfo buffer
;
3427 struct mptsas_portinfo_details
*port_details
;
3428 struct sas_port
*port
;
3433 /* see if expander is still there before deleting */
3434 mptsas_sas_expander_pg0(ioc
, &buffer
,
3435 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3436 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
),
3437 port_info
->phy_info
[0].identify
.handle
);
3439 if (buffer
.num_phys
) {
3440 kfree(buffer
.phy_info
);
3447 * Obtain the port_info instance to the parent port
3449 port_details
= NULL
;
3450 expander_sas_address
=
3451 port_info
->phy_info
[0].identify
.sas_address
;
3452 parent
= mptsas_find_portinfo_by_handle(ioc
,
3453 port_info
->phy_info
[0].identify
.handle_parent
);
3454 mptsas_delete_expander_siblings(ioc
, parent
, port_info
);
3459 * Delete rphys in the parent that point
3462 phy_info
= parent
->phy_info
;
3464 for (i
= 0; i
< parent
->num_phys
; i
++, phy_info
++) {
3467 if (phy_info
->attached
.sas_address
!=
3468 expander_sas_address
)
3471 port
= mptsas_get_port(phy_info
);
3472 port_details
= phy_info
->port_details
;
3474 dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
3475 MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n", ioc
->name
,
3476 phy_info
->phy_id
, phy_info
->phy
);
3477 sas_port_delete_phy(port
, phy_info
->phy
);
3480 dev_printk(KERN_DEBUG
, &port
->dev
,
3481 MYIOC_s_FMT
"delete port %d, sas_addr (0x%llx)\n",
3482 ioc
->name
, port
->port_identifier
,
3483 (unsigned long long)expander_sas_address
);
3484 sas_port_delete(port
);
3485 mptsas_port_delete(ioc
, port_details
);
3489 printk(MYIOC_s_INFO_FMT
"delete expander: num_phys %d, "
3490 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3491 (unsigned long long)expander_sas_address
);
3496 list_del(&port_info
->list
);
3497 kfree(port_info
->phy_info
);
3503 * mptsas_send_expander_event - expanders events
3504 * @ioc: Pointer to MPT_ADAPTER structure
3505 * @expander_data: event data
3508 * This function handles adding, removing, and refreshing
3509 * device handles within the expander objects.
3512 mptsas_send_expander_event(struct fw_event_work
*fw_event
)
3515 MpiEventDataSasExpanderStatusChange_t
*expander_data
;
3516 struct mptsas_portinfo
*port_info
;
3520 ioc
= fw_event
->ioc
;
3521 expander_data
= (MpiEventDataSasExpanderStatusChange_t
*)
3522 fw_event
->event_data
;
3523 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3524 sas_address
= le64_to_cpu(sas_address
);
3525 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3527 if (expander_data
->ReasonCode
== MPI_EVENT_SAS_EXP_RC_ADDED
) {
3529 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3530 port_info
->phy_info
[i
].portinfo
= port_info
;
3531 port_info
->phy_info
[i
].handle
=
3532 le16_to_cpu(expander_data
->DevHandle
);
3533 port_info
->phy_info
[i
].identify
.sas_address
=
3534 le64_to_cpu(sas_address
);
3535 port_info
->phy_info
[i
].identify
.handle_parent
=
3536 le16_to_cpu(expander_data
->ParentDevHandle
);
3538 mptsas_expander_refresh(ioc
, port_info
);
3539 } else if (!port_info
&& expander_data
->NumPhys
)
3540 mptsas_expander_event_add(ioc
, expander_data
);
3541 } else if (expander_data
->ReasonCode
==
3542 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
)
3543 mptsas_expander_delete(ioc
, port_info
, 0);
3545 mptsas_free_fw_event(ioc
, fw_event
);
3550 * mptsas_expander_add -
3551 * @ioc: Pointer to MPT_ADAPTER structure
3555 struct mptsas_portinfo
*
3556 mptsas_expander_add(MPT_ADAPTER
*ioc
, u16 handle
)
3558 struct mptsas_portinfo buffer
, *port_info
;
3561 if ((mptsas_sas_expander_pg0(ioc
, &buffer
,
3562 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3563 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)))
3566 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_ATOMIC
);
3568 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3569 "%s: exit at line=%d\n", ioc
->name
,
3570 __func__
, __LINE__
));
3573 port_info
->num_phys
= buffer
.num_phys
;
3574 port_info
->phy_info
= buffer
.phy_info
;
3575 for (i
= 0; i
< port_info
->num_phys
; i
++)
3576 port_info
->phy_info
[i
].portinfo
= port_info
;
3577 mutex_lock(&ioc
->sas_topology_mutex
);
3578 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3579 mutex_unlock(&ioc
->sas_topology_mutex
);
3580 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3581 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3582 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3583 mptsas_expander_refresh(ioc
, port_info
);
3588 mptsas_send_link_status_event(struct fw_event_work
*fw_event
)
3591 MpiEventDataSasPhyLinkStatus_t
*link_data
;
3592 struct mptsas_portinfo
*port_info
;
3593 struct mptsas_phyinfo
*phy_info
= NULL
;
3598 ioc
= fw_event
->ioc
;
3599 link_data
= (MpiEventDataSasPhyLinkStatus_t
*)fw_event
->event_data
;
3601 memcpy(&sas_address
, &link_data
->SASAddress
, sizeof(__le64
));
3602 sas_address
= le64_to_cpu(sas_address
);
3603 link_rate
= link_data
->LinkRates
>> 4;
3604 phy_num
= link_data
->PhyNum
;
3606 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3608 phy_info
= &port_info
->phy_info
[phy_num
];
3610 phy_info
->negotiated_link_rate
= link_rate
;
3613 if (link_rate
== MPI_SAS_IOUNIT0_RATE_1_5
||
3614 link_rate
== MPI_SAS_IOUNIT0_RATE_3_0
) {
3617 if (ioc
->old_sas_discovery_protocal
) {
3618 port_info
= mptsas_expander_add(ioc
,
3619 le16_to_cpu(link_data
->DevHandle
));
3626 if (port_info
== ioc
->hba_port_info
)
3627 mptsas_probe_hba_phys(ioc
);
3629 mptsas_expander_refresh(ioc
, port_info
);
3630 } else if (phy_info
&& phy_info
->phy
) {
3631 if (link_rate
== MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
)
3632 phy_info
->phy
->negotiated_linkrate
=
3634 else if (link_rate
==
3635 MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
)
3636 phy_info
->phy
->negotiated_linkrate
=
3637 SAS_LINK_RATE_FAILED
;
3639 phy_info
->phy
->negotiated_linkrate
=
3640 SAS_LINK_RATE_UNKNOWN
;
3643 mptsas_free_fw_event(ioc
, fw_event
);
3647 mptsas_not_responding_devices(MPT_ADAPTER
*ioc
)
3649 struct mptsas_portinfo buffer
, *port_info
;
3650 struct mptsas_device_info
*sas_info
;
3651 struct mptsas_devinfo sas_device
;
3653 VirtTarget
*vtarget
= NULL
;
3654 struct mptsas_phyinfo
*phy_info
;
3656 int retval
, retry_count
;
3657 unsigned long flags
;
3659 mpt_findImVolumes(ioc
);
3661 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3662 if (ioc
->ioc_reset_in_progress
) {
3663 dfailprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3664 "%s: exiting due to a parallel reset \n", ioc
->name
,
3666 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3669 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3671 /* devices, logical volumes */
3672 mutex_lock(&ioc
->sas_device_info_mutex
);
3674 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
, list
) {
3675 if (sas_info
->is_cached
)
3677 if (!sas_info
->is_logical_volume
) {
3678 sas_device
.handle
= 0;
3681 retval
= mptsas_sas_device_pg0(ioc
, &sas_device
,
3682 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
3683 << MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3684 (sas_info
->fw
.channel
<< 8) +
3687 if (sas_device
.handle
)
3689 if (retval
== -EBUSY
) {
3690 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3691 if (ioc
->ioc_reset_in_progress
) {
3693 printk(MYIOC_s_DEBUG_FMT
3694 "%s: exiting due to reset\n",
3695 ioc
->name
, __func__
));
3696 spin_unlock_irqrestore
3697 (&ioc
->taskmgmt_lock
, flags
);
3699 sas_device_info_mutex
);
3702 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
,
3706 if (retval
&& (retval
!= -ENODEV
)) {
3707 if (retry_count
< 10) {
3711 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3712 "%s: Config page retry exceeded retry "
3713 "count deleting device 0x%llx\n",
3714 ioc
->name
, __func__
,
3715 sas_info
->sas_address
));
3720 vtarget
= mptsas_find_vtarget(ioc
,
3721 sas_info
->fw
.channel
, sas_info
->fw
.id
);
3724 vtarget
->deleted
= 1;
3726 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
3727 sas_info
->sas_address
);
3730 mptsas_del_end_device(ioc
, phy_info
);
3731 goto redo_device_scan
;
3734 mptsas_volume_delete(ioc
, sas_info
->fw
.id
);
3736 mutex_unlock(&ioc
->sas_device_info_mutex
);
3739 mutex_lock(&ioc
->sas_topology_mutex
);
3741 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3743 if (port_info
->phy_info
&&
3744 (!(port_info
->phy_info
[0].identify
.device_info
&
3745 MPI_SAS_DEVICE_INFO_SMP_TARGET
)))
3749 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3750 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3751 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
) &&
3754 handle
= buffer
.phy_info
[0].handle
;
3755 if (buffer
.phy_info
[0].identify
.sas_address
==
3756 port_info
->phy_info
[0].identify
.sas_address
) {
3759 kfree(buffer
.phy_info
);
3762 if (!found_expander
) {
3763 mptsas_expander_delete(ioc
, port_info
, 0);
3764 goto redo_expander_scan
;
3767 mutex_unlock(&ioc
->sas_topology_mutex
);
3771 * mptsas_probe_expanders - adding expanders
3772 * @ioc: Pointer to MPT_ADAPTER structure
3776 mptsas_probe_expanders(MPT_ADAPTER
*ioc
)
3778 struct mptsas_portinfo buffer
, *port_info
;
3783 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3784 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3785 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)) {
3787 handle
= buffer
.phy_info
[0].handle
;
3788 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3789 buffer
.phy_info
[0].identify
.sas_address
);
3792 /* refreshing handles */
3793 for (i
= 0; i
< buffer
.num_phys
; i
++) {
3794 port_info
->phy_info
[i
].handle
= handle
;
3795 port_info
->phy_info
[i
].identify
.handle_parent
=
3796 buffer
.phy_info
[0].identify
.handle_parent
;
3798 mptsas_expander_refresh(ioc
, port_info
);
3799 kfree(buffer
.phy_info
);
3803 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3805 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3806 "%s: exit at line=%d\n", ioc
->name
,
3807 __func__
, __LINE__
));
3810 port_info
->num_phys
= buffer
.num_phys
;
3811 port_info
->phy_info
= buffer
.phy_info
;
3812 for (i
= 0; i
< port_info
->num_phys
; i
++)
3813 port_info
->phy_info
[i
].portinfo
= port_info
;
3814 mutex_lock(&ioc
->sas_topology_mutex
);
3815 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3816 mutex_unlock(&ioc
->sas_topology_mutex
);
3817 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3818 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3819 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3820 mptsas_expander_refresh(ioc
, port_info
);
3825 mptsas_probe_devices(MPT_ADAPTER
*ioc
)
3828 struct mptsas_devinfo sas_device
;
3829 struct mptsas_phyinfo
*phy_info
;
3832 while (!(mptsas_sas_device_pg0(ioc
, &sas_device
,
3833 MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE
, handle
))) {
3835 handle
= sas_device
.handle
;
3837 if ((sas_device
.device_info
&
3838 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
3839 MPI_SAS_DEVICE_INFO_STP_TARGET
|
3840 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0)
3843 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
3847 if (mptsas_get_rphy(phy_info
))
3850 mptsas_add_end_device(ioc
, phy_info
);
3855 * mptsas_scan_sas_topology -
3856 * @ioc: Pointer to MPT_ADAPTER structure
3861 mptsas_scan_sas_topology(MPT_ADAPTER
*ioc
)
3863 struct scsi_device
*sdev
;
3866 mptsas_probe_hba_phys(ioc
);
3867 mptsas_probe_expanders(ioc
);
3868 mptsas_probe_devices(ioc
);
3871 Reporting RAID volumes.
3873 if (!ioc
->ir_firmware
|| !ioc
->raid_data
.pIocPg2
||
3874 !ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
3876 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
3877 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3878 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3880 scsi_device_put(sdev
);
3883 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
3884 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
3885 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
);
3886 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3887 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3893 mptsas_handle_queue_full_event(struct fw_event_work
*fw_event
)
3896 EventDataQueueFull_t
*qfull_data
;
3897 struct mptsas_device_info
*sas_info
;
3898 struct scsi_device
*sdev
;
3902 int fw_id
, fw_channel
;
3906 ioc
= fw_event
->ioc
;
3907 qfull_data
= (EventDataQueueFull_t
*)fw_event
->event_data
;
3908 fw_id
= qfull_data
->TargetID
;
3909 fw_channel
= qfull_data
->Bus
;
3910 current_depth
= le16_to_cpu(qfull_data
->CurrentDepth
);
3912 /* if hidden raid component, look for the volume id */
3913 mutex_lock(&ioc
->sas_device_info_mutex
);
3914 if (mptscsih_is_phys_disk(ioc
, fw_channel
, fw_id
)) {
3915 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3917 if (sas_info
->is_cached
||
3918 sas_info
->is_logical_volume
)
3920 if (sas_info
->is_hidden_raid_component
&&
3921 (sas_info
->fw
.channel
== fw_channel
&&
3922 sas_info
->fw
.id
== fw_id
)) {
3923 id
= sas_info
->volume_id
;
3924 channel
= MPTSAS_RAID_CHANNEL
;
3929 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3931 if (sas_info
->is_cached
||
3932 sas_info
->is_hidden_raid_component
||
3933 sas_info
->is_logical_volume
)
3935 if (sas_info
->fw
.channel
== fw_channel
&&
3936 sas_info
->fw
.id
== fw_id
) {
3937 id
= sas_info
->os
.id
;
3938 channel
= sas_info
->os
.channel
;
3946 mutex_unlock(&ioc
->sas_device_info_mutex
);
3949 shost_for_each_device(sdev
, ioc
->sh
) {
3950 if (sdev
->id
== id
&& sdev
->channel
== channel
) {
3951 if (current_depth
> sdev
->queue_depth
) {
3952 sdev_printk(KERN_INFO
, sdev
,
3953 "strange observation, the queue "
3954 "depth is (%d) meanwhile fw queue "
3955 "depth (%d)\n", sdev
->queue_depth
,
3959 depth
= scsi_track_queue_full(sdev
,
3962 sdev_printk(KERN_INFO
, sdev
,
3963 "Queue depth reduced to (%d)\n",
3966 sdev_printk(KERN_INFO
, sdev
,
3967 "Tagged Command Queueing is being "
3969 else if (depth
== 0)
3970 sdev_printk(KERN_INFO
, sdev
,
3971 "Queue depth not changed yet\n");
3976 mptsas_free_fw_event(ioc
, fw_event
);
3980 static struct mptsas_phyinfo
*
3981 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER
*ioc
, u64 sas_address
)
3983 struct mptsas_portinfo
*port_info
;
3984 struct mptsas_phyinfo
*phy_info
= NULL
;
3987 mutex_lock(&ioc
->sas_topology_mutex
);
3988 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3989 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3990 if (!mptsas_is_end_device(
3991 &port_info
->phy_info
[i
].attached
))
3993 if (port_info
->phy_info
[i
].attached
.sas_address
3996 phy_info
= &port_info
->phy_info
[i
];
4000 mutex_unlock(&ioc
->sas_topology_mutex
);
4005 * mptsas_find_phyinfo_by_phys_disk_num -
4006 * @ioc: Pointer to MPT_ADAPTER structure
4012 static struct mptsas_phyinfo
*
4013 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER
*ioc
, u8 phys_disk_num
,
4016 struct mptsas_phyinfo
*phy_info
= NULL
;
4017 struct mptsas_portinfo
*port_info
;
4018 RaidPhysDiskPage1_t
*phys_disk
= NULL
;
4020 u64 sas_address
= 0;
4024 if (!ioc
->raid_data
.pIocPg3
)
4026 /* dual port support */
4027 num_paths
= mpt_raid_phys_disk_get_num_paths(ioc
, phys_disk_num
);
4030 phys_disk
= kzalloc(offsetof(RaidPhysDiskPage1_t
, Path
) +
4031 (num_paths
* sizeof(RAID_PHYS_DISK1_PATH
)), GFP_KERNEL
);
4034 mpt_raid_phys_disk_pg1(ioc
, phys_disk_num
, phys_disk
);
4035 for (i
= 0; i
< num_paths
; i
++) {
4036 if ((phys_disk
->Path
[i
].Flags
& 1) != 0)
4037 /* entry no longer valid */
4039 if ((id
== phys_disk
->Path
[i
].PhysDiskID
) &&
4040 (channel
== phys_disk
->Path
[i
].PhysDiskBus
)) {
4041 memcpy(&sas_address
, &phys_disk
->Path
[i
].WWID
,
4043 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4055 * Extra code to handle RAID0 case, where the sas_address is not updated
4056 * in phys_disk_page_1 when hotswapped
4058 mutex_lock(&ioc
->sas_topology_mutex
);
4059 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
4060 for (i
= 0; i
< port_info
->num_phys
&& !phy_info
; i
++) {
4061 if (!mptsas_is_end_device(
4062 &port_info
->phy_info
[i
].attached
))
4064 if (port_info
->phy_info
[i
].attached
.phys_disk_num
== ~0)
4066 if ((port_info
->phy_info
[i
].attached
.phys_disk_num
==
4068 (port_info
->phy_info
[i
].attached
.id
== id
) &&
4069 (port_info
->phy_info
[i
].attached
.channel
==
4071 phy_info
= &port_info
->phy_info
[i
];
4074 mutex_unlock(&ioc
->sas_topology_mutex
);
4079 mptsas_reprobe_lun(struct scsi_device
*sdev
, void *data
)
4083 sdev
->no_uld_attach
= data
? 1 : 0;
4084 rc
= scsi_device_reprobe(sdev
);
4088 mptsas_reprobe_target(struct scsi_target
*starget
, int uld_attach
)
4090 starget_for_each_device(starget
, uld_attach
? (void *)1 : NULL
,
4091 mptsas_reprobe_lun
);
4095 mptsas_adding_inactive_raid_components(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
4098 ConfigPageHeader_t hdr
;
4099 dma_addr_t dma_handle
;
4100 pRaidVolumePage0_t buffer
= NULL
;
4101 RaidPhysDiskPage0_t phys_disk
;
4103 struct mptsas_phyinfo
*phy_info
;
4104 struct mptsas_devinfo sas_device
;
4106 memset(&cfg
, 0 , sizeof(CONFIGPARMS
));
4107 memset(&hdr
, 0 , sizeof(ConfigPageHeader_t
));
4108 hdr
.PageType
= MPI_CONFIG_PAGETYPE_RAID_VOLUME
;
4109 cfg
.pageAddr
= (channel
<< 8) + id
;
4110 cfg
.cfghdr
.hdr
= &hdr
;
4111 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
4112 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
4114 if (mpt_config(ioc
, &cfg
) != 0)
4117 if (!hdr
.PageLength
)
4120 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.PageLength
* 4,
4126 cfg
.physAddr
= dma_handle
;
4127 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
4129 if (mpt_config(ioc
, &cfg
) != 0)
4132 if (!(buffer
->VolumeStatus
.Flags
&
4133 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE
))
4136 if (!buffer
->NumPhysDisks
)
4139 for (i
= 0; i
< buffer
->NumPhysDisks
; i
++) {
4141 if (mpt_raid_phys_disk_pg0(ioc
,
4142 buffer
->PhysDisk
[i
].PhysDiskNum
, &phys_disk
) != 0)
4145 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4146 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4147 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4148 (phys_disk
.PhysDiskBus
<< 8) +
4149 phys_disk
.PhysDiskID
))
4152 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4153 sas_device
.sas_address
);
4154 mptsas_add_end_device(ioc
, phy_info
);
4159 pci_free_consistent(ioc
->pcidev
, hdr
.PageLength
* 4, buffer
,
4163 * Work queue thread to handle SAS hotplug events
4166 mptsas_hotplug_work(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
4167 struct mptsas_hotplug_event
*hot_plug_info
)
4169 struct mptsas_phyinfo
*phy_info
;
4170 struct scsi_target
* starget
;
4171 struct mptsas_devinfo sas_device
;
4172 VirtTarget
*vtarget
;
4175 switch (hot_plug_info
->event_type
) {
4177 case MPTSAS_ADD_PHYSDISK
:
4179 if (!ioc
->raid_data
.pIocPg2
)
4182 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
4183 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
==
4184 hot_plug_info
->id
) {
4185 printk(MYIOC_s_WARN_FMT
"firmware bug: unable "
4186 "to add hidden disk - target_id matchs "
4187 "volume_id\n", ioc
->name
);
4188 mptsas_free_fw_event(ioc
, fw_event
);
4192 mpt_findImVolumes(ioc
);
4194 case MPTSAS_ADD_DEVICE
:
4195 memset(&sas_device
, 0, sizeof(struct mptsas_devinfo
));
4196 mptsas_sas_device_pg0(ioc
, &sas_device
,
4197 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4198 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4199 (hot_plug_info
->channel
<< 8) +
4202 if (!sas_device
.handle
)
4205 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
4209 if (mptsas_get_rphy(phy_info
))
4212 mptsas_add_end_device(ioc
, phy_info
);
4215 case MPTSAS_DEL_DEVICE
:
4216 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4217 hot_plug_info
->sas_address
);
4218 mptsas_del_end_device(ioc
, phy_info
);
4221 case MPTSAS_DEL_PHYSDISK
:
4223 mpt_findImVolumes(ioc
);
4225 phy_info
= mptsas_find_phyinfo_by_phys_disk_num(
4226 ioc
, hot_plug_info
->phys_disk_num
,
4227 hot_plug_info
->channel
,
4229 mptsas_del_end_device(ioc
, phy_info
);
4232 case MPTSAS_ADD_PHYSDISK_REPROBE
:
4234 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4235 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4236 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4237 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4238 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4239 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4240 __func__
, hot_plug_info
->id
, __LINE__
));
4244 phy_info
= mptsas_find_phyinfo_by_sas_address(
4245 ioc
, sas_device
.sas_address
);
4248 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4249 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4250 __func__
, hot_plug_info
->id
, __LINE__
));
4254 starget
= mptsas_get_starget(phy_info
);
4256 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4257 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4258 __func__
, hot_plug_info
->id
, __LINE__
));
4262 vtarget
= starget
->hostdata
;
4264 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4265 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4266 __func__
, hot_plug_info
->id
, __LINE__
));
4270 mpt_findImVolumes(ioc
);
4272 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Hidding: "
4273 "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4274 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4275 hot_plug_info
->phys_disk_num
, (unsigned long long)
4276 sas_device
.sas_address
);
4278 vtarget
->id
= hot_plug_info
->phys_disk_num
;
4279 vtarget
->tflags
|= MPT_TARGET_FLAGS_RAID_COMPONENT
;
4280 phy_info
->attached
.phys_disk_num
= hot_plug_info
->phys_disk_num
;
4281 mptsas_reprobe_target(starget
, 1);
4284 case MPTSAS_DEL_PHYSDISK_REPROBE
:
4286 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4287 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4288 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4289 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4290 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4291 "%s: fw_id=%d exit at line=%d\n",
4292 ioc
->name
, __func__
,
4293 hot_plug_info
->id
, __LINE__
));
4297 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4298 sas_device
.sas_address
);
4300 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4301 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4302 __func__
, hot_plug_info
->id
, __LINE__
));
4306 starget
= mptsas_get_starget(phy_info
);
4308 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4309 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4310 __func__
, hot_plug_info
->id
, __LINE__
));
4314 vtarget
= starget
->hostdata
;
4316 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4317 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4318 __func__
, hot_plug_info
->id
, __LINE__
));
4322 if (!(vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)) {
4323 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4324 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4325 __func__
, hot_plug_info
->id
, __LINE__
));
4329 mpt_findImVolumes(ioc
);
4331 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Exposing:"
4332 " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4333 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4334 hot_plug_info
->phys_disk_num
, (unsigned long long)
4335 sas_device
.sas_address
);
4337 vtarget
->tflags
&= ~MPT_TARGET_FLAGS_RAID_COMPONENT
;
4338 vtarget
->id
= hot_plug_info
->id
;
4339 phy_info
->attached
.phys_disk_num
= ~0;
4340 mptsas_reprobe_target(starget
, 0);
4341 mptsas_add_device_component_by_fw(ioc
,
4342 hot_plug_info
->channel
, hot_plug_info
->id
);
4345 case MPTSAS_ADD_RAID
:
4347 mpt_findImVolumes(ioc
);
4348 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
4349 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4351 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4352 hot_plug_info
->id
, 0);
4355 case MPTSAS_DEL_RAID
:
4357 mpt_findImVolumes(ioc
);
4358 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4359 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4361 scsi_remove_device(hot_plug_info
->sdev
);
4362 scsi_device_put(hot_plug_info
->sdev
);
4365 case MPTSAS_ADD_INACTIVE_VOLUME
:
4367 mpt_findImVolumes(ioc
);
4368 mptsas_adding_inactive_raid_components(ioc
,
4369 hot_plug_info
->channel
, hot_plug_info
->id
);
4376 mptsas_free_fw_event(ioc
, fw_event
);
4380 mptsas_send_sas_event(struct fw_event_work
*fw_event
)
4383 struct mptsas_hotplug_event hot_plug_info
;
4384 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
;
4388 ioc
= fw_event
->ioc
;
4389 sas_event_data
= (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)
4390 fw_event
->event_data
;
4391 device_info
= le32_to_cpu(sas_event_data
->DeviceInfo
);
4394 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
4395 MPI_SAS_DEVICE_INFO_STP_TARGET
|
4396 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0) {
4397 mptsas_free_fw_event(ioc
, fw_event
);
4401 if (sas_event_data
->ReasonCode
==
4402 MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
) {
4403 mptbase_sas_persist_operation(ioc
,
4404 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4405 mptsas_free_fw_event(ioc
, fw_event
);
4409 switch (sas_event_data
->ReasonCode
) {
4410 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
:
4411 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED
:
4412 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4413 hot_plug_info
.handle
= le16_to_cpu(sas_event_data
->DevHandle
);
4414 hot_plug_info
.channel
= sas_event_data
->Bus
;
4415 hot_plug_info
.id
= sas_event_data
->TargetID
;
4416 hot_plug_info
.phy_id
= sas_event_data
->PhyNum
;
4417 memcpy(&sas_address
, &sas_event_data
->SASAddress
,
4419 hot_plug_info
.sas_address
= le64_to_cpu(sas_address
);
4420 hot_plug_info
.device_info
= device_info
;
4421 if (sas_event_data
->ReasonCode
&
4422 MPI_EVENT_SAS_DEV_STAT_RC_ADDED
)
4423 hot_plug_info
.event_type
= MPTSAS_ADD_DEVICE
;
4425 hot_plug_info
.event_type
= MPTSAS_DEL_DEVICE
;
4426 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4429 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
:
4430 mptbase_sas_persist_operation(ioc
,
4431 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4432 mptsas_free_fw_event(ioc
, fw_event
);
4435 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA
:
4437 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET
:
4440 mptsas_free_fw_event(ioc
, fw_event
);
4446 mptsas_send_raid_event(struct fw_event_work
*fw_event
)
4449 EVENT_DATA_RAID
*raid_event_data
;
4450 struct mptsas_hotplug_event hot_plug_info
;
4453 struct scsi_device
*sdev
= NULL
;
4454 VirtDevice
*vdevice
= NULL
;
4455 RaidPhysDiskPage0_t phys_disk
;
4457 ioc
= fw_event
->ioc
;
4458 raid_event_data
= (EVENT_DATA_RAID
*)fw_event
->event_data
;
4459 status
= le32_to_cpu(raid_event_data
->SettingsStatus
);
4460 state
= (status
>> 8) & 0xff;
4462 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4463 hot_plug_info
.id
= raid_event_data
->VolumeID
;
4464 hot_plug_info
.channel
= raid_event_data
->VolumeBus
;
4465 hot_plug_info
.phys_disk_num
= raid_event_data
->PhysDiskNum
;
4467 if (raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_DELETED
||
4468 raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_CREATED
||
4469 raid_event_data
->ReasonCode
==
4470 MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
) {
4471 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4472 hot_plug_info
.id
, 0);
4473 hot_plug_info
.sdev
= sdev
;
4475 vdevice
= sdev
->hostdata
;
4478 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4479 "ReasonCode=%02x\n", ioc
->name
, __func__
,
4480 raid_event_data
->ReasonCode
));
4482 switch (raid_event_data
->ReasonCode
) {
4483 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED
:
4484 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK_REPROBE
;
4486 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED
:
4487 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK_REPROBE
;
4489 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED
:
4491 case MPI_PD_STATE_ONLINE
:
4492 case MPI_PD_STATE_NOT_COMPATIBLE
:
4493 mpt_raid_phys_disk_pg0(ioc
,
4494 raid_event_data
->PhysDiskNum
, &phys_disk
);
4495 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4496 hot_plug_info
.channel
= phys_disk
.PhysDiskBus
;
4497 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4499 case MPI_PD_STATE_FAILED
:
4500 case MPI_PD_STATE_MISSING
:
4501 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST
:
4502 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST
:
4503 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON
:
4504 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4510 case MPI_EVENT_RAID_RC_VOLUME_DELETED
:
4513 vdevice
->vtarget
->deleted
= 1; /* block IO */
4514 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4516 case MPI_EVENT_RAID_RC_VOLUME_CREATED
:
4518 scsi_device_put(sdev
);
4521 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4523 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
:
4524 if (!(status
& MPI_RAIDVOL0_STATUS_FLAG_ENABLED
)) {
4527 vdevice
->vtarget
->deleted
= 1; /* block IO */
4528 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4532 case MPI_RAIDVOL0_STATUS_STATE_FAILED
:
4533 case MPI_RAIDVOL0_STATUS_STATE_MISSING
:
4536 vdevice
->vtarget
->deleted
= 1; /* block IO */
4537 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4539 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL
:
4540 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED
:
4542 scsi_device_put(sdev
);
4545 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4555 if (hot_plug_info
.event_type
!= MPTSAS_IGNORE_EVENT
)
4556 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4558 mptsas_free_fw_event(ioc
, fw_event
);
4562 * mptsas_issue_tm - send mptsas internal tm request
4563 * @ioc: Pointer to MPT_ADAPTER structure
4564 * @type: Task Management type
4565 * @channel: channel number for task management
4566 * @id: Logical Target ID for reset (if appropriate)
4567 * @lun: Logical unit for reset (if appropriate)
4568 * @task_context: Context for the task to be aborted
4569 * @timeout: timeout for task management control
4571 * return 0 on success and -1 on failure:
4575 mptsas_issue_tm(MPT_ADAPTER
*ioc
, u8 type
, u8 channel
, u8 id
, u64 lun
,
4576 int task_context
, ulong timeout
, u8
*issue_reset
)
4579 SCSITaskMgmt_t
*pScsiTm
;
4581 unsigned long timeleft
;
4584 mf
= mpt_get_msg_frame(mptsasDeviceResetCtx
, ioc
);
4586 retval
= -1; /* return failure */
4587 dtmprintk(ioc
, printk(MYIOC_s_WARN_FMT
"TaskMgmt request: no "
4588 "msg frames!!\n", ioc
->name
));
4592 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt request: mr = %p, "
4593 "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, "
4594 "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc
->name
, mf
,
4595 type
, timeout
, channel
, id
, (unsigned long long)lun
,
4598 pScsiTm
= (SCSITaskMgmt_t
*) mf
;
4599 memset(pScsiTm
, 0, sizeof(SCSITaskMgmt_t
));
4600 pScsiTm
->Function
= MPI_FUNCTION_SCSI_TASK_MGMT
;
4601 pScsiTm
->TaskType
= type
;
4602 pScsiTm
->MsgFlags
= 0;
4603 pScsiTm
->TargetID
= id
;
4604 pScsiTm
->Bus
= channel
;
4605 pScsiTm
->ChainOffset
= 0;
4606 pScsiTm
->Reserved
= 0;
4607 pScsiTm
->Reserved1
= 0;
4608 pScsiTm
->TaskMsgContext
= task_context
;
4609 int_to_scsilun(lun
, (struct scsi_lun
*)pScsiTm
->LUN
);
4611 INITIALIZE_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4612 CLEAR_MGMT_STATUS(ioc
->internal_cmds
.status
)
4614 mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx
, ioc
, mf
);
4616 /* Now wait for the command to complete */
4617 timeleft
= wait_for_completion_timeout(&ioc
->taskmgmt_cmds
.done
,
4619 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
4620 retval
= -1; /* return failure */
4621 dtmprintk(ioc
, printk(MYIOC_s_ERR_FMT
4622 "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc
->name
, mf
));
4623 mpt_free_msg_frame(ioc
, mf
);
4624 if (ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
4630 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_RF_VALID
)) {
4631 retval
= -1; /* return failure */
4632 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4633 "TaskMgmt request: failed with no reply\n", ioc
->name
));
4638 CLEAR_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4643 * mptsas_broadcast_primative_work - Handle broadcast primitives
4644 * @work: work queue payload containing info describing the event
4646 * this will be handled in workqueue context.
4649 mptsas_broadcast_primative_work(struct fw_event_work
*fw_event
)
4651 MPT_ADAPTER
*ioc
= fw_event
->ioc
;
4653 VirtDevice
*vdevice
;
4655 struct scsi_cmnd
*sc
;
4656 SCSITaskMgmtReply_t
*pScsiTmReply
;
4661 u32 termination_count
;
4664 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4665 "%s - enter\n", ioc
->name
, __func__
));
4667 mutex_lock(&ioc
->taskmgmt_cmds
.mutex
);
4668 if (mpt_set_taskmgmt_in_progress_flag(ioc
) != 0) {
4669 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4670 mptsas_requeue_fw_event(ioc
, fw_event
, 1000);
4675 termination_count
= 0;
4677 mpt_findImVolumes(ioc
);
4678 pScsiTmReply
= (SCSITaskMgmtReply_t
*) ioc
->taskmgmt_cmds
.reply
;
4680 for (ii
= 0; ii
< ioc
->req_depth
; ii
++) {
4681 if (ioc
->fw_events_off
)
4683 sc
= mptscsih_get_scsi_lookup(ioc
, ii
);
4686 mf
= MPT_INDEX_2_MFPTR(ioc
, ii
);
4689 task_context
= mf
->u
.frame
.hwhdr
.msgctxu
.MsgContext
;
4690 vdevice
= sc
->device
->hostdata
;
4691 if (!vdevice
|| !vdevice
->vtarget
)
4693 if (vdevice
->vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)
4694 continue; /* skip hidden raid components */
4695 if (vdevice
->vtarget
->raidVolume
)
4696 continue; /* skip hidden raid components */
4697 channel
= vdevice
->vtarget
->channel
;
4698 id
= vdevice
->vtarget
->id
;
4700 if (mptsas_issue_tm(ioc
, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK
,
4701 channel
, id
, (u64
)lun
, task_context
, 30, &issue_reset
))
4704 termination_count
+=
4705 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4706 if ((pScsiTmReply
->IOCStatus
== MPI_IOCSTATUS_SUCCESS
) &&
4707 (pScsiTmReply
->ResponseCode
==
4708 MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED
||
4709 pScsiTmReply
->ResponseCode
==
4710 MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC
))
4712 if (mptsas_issue_tm(ioc
,
4713 MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET
,
4714 channel
, id
, (u64
)lun
, 0, 30, &issue_reset
))
4716 termination_count
+=
4717 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4721 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4722 "%s - exit, query_count = %d termination_count = %d\n",
4723 ioc
->name
, __func__
, query_count
, termination_count
));
4725 ioc
->broadcast_aen_busy
= 0;
4726 mpt_clear_taskmgmt_in_progress_flag(ioc
);
4727 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4730 printk(MYIOC_s_WARN_FMT
"Issuing Reset from %s!!\n",
4731 ioc
->name
, __func__
);
4732 mpt_Soft_Hard_ResetHandler(ioc
, CAN_SLEEP
);
4734 mptsas_free_fw_event(ioc
, fw_event
);
4738 * mptsas_send_ir2_event - handle exposing hidden disk when
4739 * an inactive raid volume is added
4741 * @ioc: Pointer to MPT_ADAPTER structure
4746 mptsas_send_ir2_event(struct fw_event_work
*fw_event
)
4749 struct mptsas_hotplug_event hot_plug_info
;
4750 MPI_EVENT_DATA_IR2
*ir2_data
;
4752 RaidPhysDiskPage0_t phys_disk
;
4754 ioc
= fw_event
->ioc
;
4755 ir2_data
= (MPI_EVENT_DATA_IR2
*)fw_event
->event_data
;
4756 reasonCode
= ir2_data
->ReasonCode
;
4758 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4759 "ReasonCode=%02x\n", ioc
->name
, __func__
, reasonCode
));
4761 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4762 hot_plug_info
.id
= ir2_data
->TargetID
;
4763 hot_plug_info
.channel
= ir2_data
->Bus
;
4764 switch (reasonCode
) {
4765 case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED
:
4766 hot_plug_info
.event_type
= MPTSAS_ADD_INACTIVE_VOLUME
;
4768 case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED
:
4769 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4770 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4772 case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED
:
4773 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4774 mpt_raid_phys_disk_pg0(ioc
,
4775 ir2_data
->PhysDiskNum
, &phys_disk
);
4776 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4777 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4780 mptsas_free_fw_event(ioc
, fw_event
);
4783 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4787 mptsas_event_process(MPT_ADAPTER
*ioc
, EventNotificationReply_t
*reply
)
4789 u32 event
= le32_to_cpu(reply
->Event
);
4790 int sz
, event_data_sz
;
4791 struct fw_event_work
*fw_event
;
4792 unsigned long delay
;
4794 if (ioc
->bus_type
!= SAS
)
4797 /* events turned off due to host reset or driver unloading */
4798 if (ioc
->fw_events_off
)
4801 delay
= msecs_to_jiffies(1);
4803 case MPI_EVENT_SAS_BROADCAST_PRIMITIVE
:
4805 EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*broadcast_event_data
=
4806 (EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*)reply
->Data
;
4807 if (broadcast_event_data
->Primitive
!=
4808 MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT
)
4810 if (ioc
->broadcast_aen_busy
)
4812 ioc
->broadcast_aen_busy
= 1;
4815 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
:
4817 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
=
4818 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)reply
->Data
;
4820 if (sas_event_data
->ReasonCode
==
4821 MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
) {
4822 mptsas_target_reset_queue(ioc
, sas_event_data
);
4827 case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE
:
4829 MpiEventDataSasExpanderStatusChange_t
*expander_data
=
4830 (MpiEventDataSasExpanderStatusChange_t
*)reply
->Data
;
4832 if (ioc
->old_sas_discovery_protocal
)
4835 if (expander_data
->ReasonCode
==
4836 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
&&
4837 ioc
->device_missing_delay
)
4838 delay
= HZ
* ioc
->device_missing_delay
;
4841 case MPI_EVENT_SAS_DISCOVERY
:
4843 u32 discovery_status
;
4844 EventDataSasDiscovery_t
*discovery_data
=
4845 (EventDataSasDiscovery_t
*)reply
->Data
;
4847 discovery_status
= le32_to_cpu(discovery_data
->DiscoveryStatus
);
4848 ioc
->sas_discovery_quiesce_io
= discovery_status
? 1 : 0;
4849 if (ioc
->old_sas_discovery_protocal
&& !discovery_status
)
4850 mptsas_queue_rescan(ioc
);
4853 case MPI_EVENT_INTEGRATED_RAID
:
4854 case MPI_EVENT_PERSISTENT_TABLE_FULL
:
4856 case MPI_EVENT_SAS_PHY_LINK_STATUS
:
4857 case MPI_EVENT_QUEUE_FULL
:
4863 event_data_sz
= ((reply
->MsgLength
* 4) -
4864 offsetof(EventNotificationReply_t
, Data
));
4865 sz
= offsetof(struct fw_event_work
, event_data
) + event_data_sz
;
4866 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
4868 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n", ioc
->name
,
4869 __func__
, __LINE__
);
4872 memcpy(fw_event
->event_data
, reply
->Data
, event_data_sz
);
4873 fw_event
->event
= event
;
4874 fw_event
->ioc
= ioc
;
4875 mptsas_add_fw_event(ioc
, fw_event
, delay
);
4879 /* Delete a volume when no longer listed in ioc pg2
4881 static void mptsas_volume_delete(MPT_ADAPTER
*ioc
, u8 id
)
4883 struct scsi_device
*sdev
;
4886 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
, id
, 0);
4889 if (!ioc
->raid_data
.pIocPg2
)
4891 if (!ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
4893 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++)
4894 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
== id
)
4897 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4898 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
, id
);
4899 scsi_remove_device(sdev
);
4901 scsi_device_put(sdev
);
4905 mptsas_probe(struct pci_dev
*pdev
, const struct pci_device_id
*id
)
4907 struct Scsi_Host
*sh
;
4910 unsigned long flags
;
4918 r
= mpt_attach(pdev
,id
);
4922 ioc
= pci_get_drvdata(pdev
);
4923 mptsas_fw_event_off(ioc
);
4924 ioc
->DoneCtx
= mptsasDoneCtx
;
4925 ioc
->TaskCtx
= mptsasTaskCtx
;
4926 ioc
->InternalCtx
= mptsasInternalCtx
;
4928 /* Added sanity check on readiness of the MPT adapter.
4930 if (ioc
->last_state
!= MPI_IOC_STATE_OPERATIONAL
) {
4931 printk(MYIOC_s_WARN_FMT
4932 "Skipping because it's not operational!\n",
4935 goto out_mptsas_probe
;
4939 printk(MYIOC_s_WARN_FMT
"Skipping because it's disabled!\n",
4942 goto out_mptsas_probe
;
4945 /* Sanity check - ensure at least 1 port is INITIATOR capable
4948 for (ii
= 0; ii
< ioc
->facts
.NumberOfPorts
; ii
++) {
4949 if (ioc
->pfacts
[ii
].ProtocolFlags
&
4950 MPI_PORTFACTS_PROTOCOL_INITIATOR
)
4955 printk(MYIOC_s_WARN_FMT
4956 "Skipping ioc=%p because SCSI Initiator mode "
4957 "is NOT enabled!\n", ioc
->name
, ioc
);
4961 sh
= scsi_host_alloc(&mptsas_driver_template
, sizeof(MPT_SCSI_HOST
));
4963 printk(MYIOC_s_WARN_FMT
4964 "Unable to register controller with SCSI subsystem\n",
4967 goto out_mptsas_probe
;
4970 spin_lock_irqsave(&ioc
->FreeQlock
, flags
);
4972 /* Attach the SCSI Host to the IOC structure
4980 /* set 16 byte cdb's */
4981 sh
->max_cmd_len
= 16;
4982 sh
->can_queue
= min_t(int, ioc
->req_depth
- 10, sh
->can_queue
);
4984 sh
->max_lun
= max_lun
;
4985 sh
->transportt
= mptsas_transport_template
;
4989 sh
->unique_id
= ioc
->id
;
4991 INIT_LIST_HEAD(&ioc
->sas_topology
);
4992 mutex_init(&ioc
->sas_topology_mutex
);
4993 mutex_init(&ioc
->sas_discovery_mutex
);
4994 mutex_init(&ioc
->sas_mgmt
.mutex
);
4995 init_completion(&ioc
->sas_mgmt
.done
);
4997 /* Verify that we won't exceed the maximum
4998 * number of chain buffers
4999 * We can optimize: ZZ = req_sz/sizeof(SGE)
5001 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
5002 * + (req_sz - 64)/sizeof(SGE)
5003 * A slightly different algorithm is required for
5006 scale
= ioc
->req_sz
/ioc
->SGE_size
;
5007 if (ioc
->sg_addr_size
== sizeof(u64
)) {
5008 numSGE
= (scale
- 1) *
5009 (ioc
->facts
.MaxChainDepth
-1) + scale
+
5010 (ioc
->req_sz
- 60) / ioc
->SGE_size
;
5012 numSGE
= 1 + (scale
- 1) *
5013 (ioc
->facts
.MaxChainDepth
-1) + scale
+
5014 (ioc
->req_sz
- 64) / ioc
->SGE_size
;
5017 if (numSGE
< sh
->sg_tablesize
) {
5018 /* Reset this value */
5019 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
5020 "Resetting sg_tablesize to %d from %d\n",
5021 ioc
->name
, numSGE
, sh
->sg_tablesize
));
5022 sh
->sg_tablesize
= numSGE
;
5025 hd
= shost_priv(sh
);
5028 /* SCSI needs scsi_cmnd lookup table!
5029 * (with size equal to req_depth*PtrSz!)
5031 ioc
->ScsiLookup
= kcalloc(ioc
->req_depth
, sizeof(void *), GFP_ATOMIC
);
5032 if (!ioc
->ScsiLookup
) {
5034 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
5035 goto out_mptsas_probe
;
5037 spin_lock_init(&ioc
->scsi_lookup_lock
);
5039 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"ScsiLookup @ %p\n",
5040 ioc
->name
, ioc
->ScsiLookup
));
5042 ioc
->sas_data
.ptClear
= mpt_pt_clear
;
5044 hd
->last_queue_full
= 0;
5045 INIT_LIST_HEAD(&hd
->target_reset_list
);
5046 INIT_LIST_HEAD(&ioc
->sas_device_info_list
);
5047 mutex_init(&ioc
->sas_device_info_mutex
);
5049 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
5051 if (ioc
->sas_data
.ptClear
==1) {
5052 mptbase_sas_persist_operation(
5053 ioc
, MPI_SAS_OP_CLEAR_ALL_PERSISTENT
);
5056 error
= scsi_add_host(sh
, &ioc
->pcidev
->dev
);
5058 dprintk(ioc
, printk(MYIOC_s_ERR_FMT
5059 "scsi_add_host failed\n", ioc
->name
));
5060 goto out_mptsas_probe
;
5063 /* older firmware doesn't support expander events */
5064 if ((ioc
->facts
.HeaderVersion
>> 8) < 0xE)
5065 ioc
->old_sas_discovery_protocal
= 1;
5066 mptsas_scan_sas_topology(ioc
);
5067 mptsas_fw_event_on(ioc
);
5072 mptscsih_remove(pdev
);
5077 mptsas_shutdown(struct pci_dev
*pdev
)
5079 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
5081 mptsas_fw_event_off(ioc
);
5082 mptsas_cleanup_fw_event_q(ioc
);
5085 static void __devexit
mptsas_remove(struct pci_dev
*pdev
)
5087 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
5088 struct mptsas_portinfo
*p
, *n
;
5092 printk(MYIOC_s_INFO_FMT
"IOC is in Target mode\n", ioc
->name
);
5097 mptsas_shutdown(pdev
);
5099 mptsas_del_device_components(ioc
);
5101 ioc
->sas_discovery_ignore_events
= 1;
5102 sas_remove_host(ioc
->sh
);
5104 mutex_lock(&ioc
->sas_topology_mutex
);
5105 list_for_each_entry_safe(p
, n
, &ioc
->sas_topology
, list
) {
5107 for (i
= 0 ; i
< p
->num_phys
; i
++)
5108 mptsas_port_delete(ioc
, p
->phy_info
[i
].port_details
);
5113 mutex_unlock(&ioc
->sas_topology_mutex
);
5114 ioc
->hba_port_info
= NULL
;
5115 mptscsih_remove(pdev
);
5118 static struct pci_device_id mptsas_pci_table
[] = {
5119 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064
,
5120 PCI_ANY_ID
, PCI_ANY_ID
},
5121 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068
,
5122 PCI_ANY_ID
, PCI_ANY_ID
},
5123 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064E
,
5124 PCI_ANY_ID
, PCI_ANY_ID
},
5125 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068E
,
5126 PCI_ANY_ID
, PCI_ANY_ID
},
5127 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1078
,
5128 PCI_ANY_ID
, PCI_ANY_ID
},
5129 {0} /* Terminating entry */
5131 MODULE_DEVICE_TABLE(pci
, mptsas_pci_table
);
5134 static struct pci_driver mptsas_driver
= {
5136 .id_table
= mptsas_pci_table
,
5137 .probe
= mptsas_probe
,
5138 .remove
= __devexit_p(mptsas_remove
),
5139 .shutdown
= mptsas_shutdown
,
5141 .suspend
= mptscsih_suspend
,
5142 .resume
= mptscsih_resume
,
5151 show_mptmod_ver(my_NAME
, my_VERSION
);
5153 mptsas_transport_template
=
5154 sas_attach_transport(&mptsas_transport_functions
);
5155 if (!mptsas_transport_template
)
5158 mptsasDoneCtx
= mpt_register(mptscsih_io_done
, MPTSAS_DRIVER
);
5159 mptsasTaskCtx
= mpt_register(mptscsih_taskmgmt_complete
, MPTSAS_DRIVER
);
5161 mpt_register(mptscsih_scandv_complete
, MPTSAS_DRIVER
);
5162 mptsasMgmtCtx
= mpt_register(mptsas_mgmt_done
, MPTSAS_DRIVER
);
5163 mptsasDeviceResetCtx
=
5164 mpt_register(mptsas_taskmgmt_complete
, MPTSAS_DRIVER
);
5166 mpt_event_register(mptsasDoneCtx
, mptsas_event_process
);
5167 mpt_reset_register(mptsasDoneCtx
, mptsas_ioc_reset
);
5169 error
= pci_register_driver(&mptsas_driver
);
5171 sas_release_transport(mptsas_transport_template
);
5179 pci_unregister_driver(&mptsas_driver
);
5180 sas_release_transport(mptsas_transport_template
);
5182 mpt_reset_deregister(mptsasDoneCtx
);
5183 mpt_event_deregister(mptsasDoneCtx
);
5185 mpt_deregister(mptsasMgmtCtx
);
5186 mpt_deregister(mptsasInternalCtx
);
5187 mpt_deregister(mptsasTaskCtx
);
5188 mpt_deregister(mptsasDoneCtx
);
5189 mpt_deregister(mptsasDeviceResetCtx
);
5192 module_init(mptsas_init
);
5193 module_exit(mptsas_exit
);