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 SPI 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
,
2042 /* On timeout reset the board */
2043 mpt_free_msg_frame(ioc
, mf
);
2044 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
2049 /* a reply frame is expected */
2050 if ((ioc
->sas_mgmt
.status
&
2051 MPT_MGMT_STATUS_RF_VALID
) == 0) {
2056 /* process the completed Reply Message Frame */
2057 reply
= (SasIoUnitControlReply_t
*)ioc
->sas_mgmt
.reply
;
2058 if (reply
->IOCStatus
!= MPI_IOCSTATUS_SUCCESS
) {
2059 printk(MYIOC_s_INFO_FMT
"%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
2060 ioc
->name
, __func__
, reply
->IOCStatus
, reply
->IOCLogInfo
);
2068 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2069 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2075 mptsas_get_enclosure_identifier(struct sas_rphy
*rphy
, u64
*identifier
)
2077 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2079 struct mptsas_portinfo
*p
;
2080 struct mptsas_enclosure enclosure_info
;
2081 u64 enclosure_handle
;
2083 mutex_lock(&ioc
->sas_topology_mutex
);
2084 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2085 for (i
= 0; i
< p
->num_phys
; i
++) {
2086 if (p
->phy_info
[i
].attached
.sas_address
==
2087 rphy
->identify
.sas_address
) {
2088 enclosure_handle
= p
->phy_info
[i
].
2089 attached
.handle_enclosure
;
2094 mutex_unlock(&ioc
->sas_topology_mutex
);
2098 mutex_unlock(&ioc
->sas_topology_mutex
);
2099 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
2100 error
= mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
2101 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
2102 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
), enclosure_handle
);
2104 *identifier
= enclosure_info
.enclosure_logical_id
;
2109 mptsas_get_bay_identifier(struct sas_rphy
*rphy
)
2111 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2112 struct mptsas_portinfo
*p
;
2115 mutex_lock(&ioc
->sas_topology_mutex
);
2116 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2117 for (i
= 0; i
< p
->num_phys
; i
++) {
2118 if (p
->phy_info
[i
].attached
.sas_address
==
2119 rphy
->identify
.sas_address
) {
2120 rc
= p
->phy_info
[i
].attached
.slot
;
2127 mutex_unlock(&ioc
->sas_topology_mutex
);
2131 static int mptsas_smp_handler(struct Scsi_Host
*shost
, struct sas_rphy
*rphy
,
2132 struct request
*req
)
2134 MPT_ADAPTER
*ioc
= ((MPT_SCSI_HOST
*) shost
->hostdata
)->ioc
;
2136 SmpPassthroughRequest_t
*smpreq
;
2137 struct request
*rsp
= req
->next_rq
;
2140 unsigned long timeleft
;
2142 dma_addr_t dma_addr_in
= 0;
2143 dma_addr_t dma_addr_out
= 0;
2144 u64 sas_address
= 0;
2147 printk(MYIOC_s_ERR_FMT
"%s: the smp response space is missing\n",
2148 ioc
->name
, __func__
);
2152 /* do we need to support multiple segments? */
2153 if (req
->bio
->bi_vcnt
> 1 || rsp
->bio
->bi_vcnt
> 1) {
2154 printk(MYIOC_s_ERR_FMT
"%s: multiple segments req %u %u, rsp %u %u\n",
2155 ioc
->name
, __func__
, req
->bio
->bi_vcnt
, blk_rq_bytes(req
),
2156 rsp
->bio
->bi_vcnt
, blk_rq_bytes(rsp
));
2160 ret
= mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
);
2164 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2170 smpreq
= (SmpPassthroughRequest_t
*)mf
;
2171 memset(smpreq
, 0, sizeof(*smpreq
));
2173 smpreq
->RequestDataLength
= cpu_to_le16(blk_rq_bytes(req
) - 4);
2174 smpreq
->Function
= MPI_FUNCTION_SMP_PASSTHROUGH
;
2177 sas_address
= rphy
->identify
.sas_address
;
2179 struct mptsas_portinfo
*port_info
;
2181 mutex_lock(&ioc
->sas_topology_mutex
);
2182 port_info
= ioc
->hba_port_info
;
2183 if (port_info
&& port_info
->phy_info
)
2185 port_info
->phy_info
[0].phy
->identify
.sas_address
;
2186 mutex_unlock(&ioc
->sas_topology_mutex
);
2189 *((u64
*)&smpreq
->SASAddress
) = cpu_to_le64(sas_address
);
2192 (((int *) mf
) + (offsetof(SmpPassthroughRequest_t
, SGL
) / 4));
2195 flagsLength
= (MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2196 MPI_SGE_FLAGS_END_OF_BUFFER
|
2197 MPI_SGE_FLAGS_DIRECTION
)
2198 << MPI_SGE_FLAGS_SHIFT
;
2199 flagsLength
|= (blk_rq_bytes(req
) - 4);
2201 dma_addr_out
= pci_map_single(ioc
->pcidev
, bio_data(req
->bio
),
2202 blk_rq_bytes(req
), PCI_DMA_BIDIRECTIONAL
);
2205 ioc
->add_sge(psge
, flagsLength
, dma_addr_out
);
2206 psge
+= ioc
->SGE_size
;
2209 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2210 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2211 MPI_SGE_FLAGS_IOC_TO_HOST
|
2212 MPI_SGE_FLAGS_END_OF_BUFFER
;
2214 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2215 flagsLength
|= blk_rq_bytes(rsp
) + 4;
2216 dma_addr_in
= pci_map_single(ioc
->pcidev
, bio_data(rsp
->bio
),
2217 blk_rq_bytes(rsp
), PCI_DMA_BIDIRECTIONAL
);
2220 ioc
->add_sge(psge
, flagsLength
, dma_addr_in
);
2222 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2223 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2225 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
, 10 * HZ
);
2227 printk(MYIOC_s_ERR_FMT
"%s: smp timeout!\n", ioc
->name
, __func__
);
2228 /* On timeout reset the board */
2229 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
2235 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_RF_VALID
) {
2236 SmpPassthroughReply_t
*smprep
;
2238 smprep
= (SmpPassthroughReply_t
*)ioc
->sas_mgmt
.reply
;
2239 memcpy(req
->sense
, smprep
, sizeof(*smprep
));
2240 req
->sense_len
= sizeof(*smprep
);
2242 rsp
->resid_len
-= smprep
->ResponseDataLength
;
2244 printk(MYIOC_s_ERR_FMT
2245 "%s: smp passthru reply failed to be returned\n",
2246 ioc
->name
, __func__
);
2251 pci_unmap_single(ioc
->pcidev
, dma_addr_out
, blk_rq_bytes(req
),
2252 PCI_DMA_BIDIRECTIONAL
);
2254 pci_unmap_single(ioc
->pcidev
, dma_addr_in
, blk_rq_bytes(rsp
),
2255 PCI_DMA_BIDIRECTIONAL
);
2258 mpt_free_msg_frame(ioc
, mf
);
2260 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2261 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2266 static struct sas_function_template mptsas_transport_functions
= {
2267 .get_linkerrors
= mptsas_get_linkerrors
,
2268 .get_enclosure_identifier
= mptsas_get_enclosure_identifier
,
2269 .get_bay_identifier
= mptsas_get_bay_identifier
,
2270 .phy_reset
= mptsas_phy_reset
,
2271 .smp_handler
= mptsas_smp_handler
,
2274 static struct scsi_transport_template
*mptsas_transport_template
;
2277 mptsas_sas_io_unit_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
2279 ConfigExtendedPageHeader_t hdr
;
2281 SasIOUnitPage0_t
*buffer
;
2282 dma_addr_t dma_handle
;
2285 hdr
.PageVersion
= MPI_SASIOUNITPAGE0_PAGEVERSION
;
2286 hdr
.ExtPageLength
= 0;
2290 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2291 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2293 cfg
.cfghdr
.ehdr
= &hdr
;
2296 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2297 cfg
.dir
= 0; /* read */
2298 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2300 error
= mpt_config(ioc
, &cfg
);
2303 if (!hdr
.ExtPageLength
) {
2308 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2315 cfg
.physAddr
= dma_handle
;
2316 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2318 error
= mpt_config(ioc
, &cfg
);
2320 goto out_free_consistent
;
2322 port_info
->num_phys
= buffer
->NumPhys
;
2323 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2324 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2325 if (!port_info
->phy_info
) {
2327 goto out_free_consistent
;
2330 ioc
->nvdata_version_persistent
=
2331 le16_to_cpu(buffer
->NvdataVersionPersistent
);
2332 ioc
->nvdata_version_default
=
2333 le16_to_cpu(buffer
->NvdataVersionDefault
);
2335 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2336 mptsas_print_phy_data(ioc
, &buffer
->PhyData
[i
]);
2337 port_info
->phy_info
[i
].phy_id
= i
;
2338 port_info
->phy_info
[i
].port_id
=
2339 buffer
->PhyData
[i
].Port
;
2340 port_info
->phy_info
[i
].negotiated_link_rate
=
2341 buffer
->PhyData
[i
].NegotiatedLinkRate
;
2342 port_info
->phy_info
[i
].portinfo
= port_info
;
2343 port_info
->phy_info
[i
].handle
=
2344 le16_to_cpu(buffer
->PhyData
[i
].ControllerDevHandle
);
2347 out_free_consistent
:
2348 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2349 buffer
, dma_handle
);
2355 mptsas_sas_io_unit_pg1(MPT_ADAPTER
*ioc
)
2357 ConfigExtendedPageHeader_t hdr
;
2359 SasIOUnitPage1_t
*buffer
;
2360 dma_addr_t dma_handle
;
2362 u16 device_missing_delay
;
2364 memset(&hdr
, 0, sizeof(ConfigExtendedPageHeader_t
));
2365 memset(&cfg
, 0, sizeof(CONFIGPARMS
));
2367 cfg
.cfghdr
.ehdr
= &hdr
;
2368 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2369 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2370 cfg
.cfghdr
.ehdr
->PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2371 cfg
.cfghdr
.ehdr
->ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2372 cfg
.cfghdr
.ehdr
->PageVersion
= MPI_SASIOUNITPAGE1_PAGEVERSION
;
2373 cfg
.cfghdr
.ehdr
->PageNumber
= 1;
2375 error
= mpt_config(ioc
, &cfg
);
2378 if (!hdr
.ExtPageLength
) {
2383 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2390 cfg
.physAddr
= dma_handle
;
2391 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2393 error
= mpt_config(ioc
, &cfg
);
2395 goto out_free_consistent
;
2397 ioc
->io_missing_delay
=
2398 le16_to_cpu(buffer
->IODeviceMissingDelay
);
2399 device_missing_delay
= le16_to_cpu(buffer
->ReportDeviceMissingDelay
);
2400 ioc
->device_missing_delay
= (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16
) ?
2401 (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
) * 16 :
2402 device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
;
2404 out_free_consistent
:
2405 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2406 buffer
, dma_handle
);
2412 mptsas_sas_phy_pg0(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2413 u32 form
, u32 form_specific
)
2415 ConfigExtendedPageHeader_t hdr
;
2417 SasPhyPage0_t
*buffer
;
2418 dma_addr_t dma_handle
;
2421 hdr
.PageVersion
= MPI_SASPHY0_PAGEVERSION
;
2422 hdr
.ExtPageLength
= 0;
2426 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2427 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_PHY
;
2429 cfg
.cfghdr
.ehdr
= &hdr
;
2430 cfg
.dir
= 0; /* read */
2431 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2433 /* Get Phy Pg 0 for each Phy. */
2435 cfg
.pageAddr
= form
+ form_specific
;
2436 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2438 error
= mpt_config(ioc
, &cfg
);
2442 if (!hdr
.ExtPageLength
) {
2447 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2454 cfg
.physAddr
= dma_handle
;
2455 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2457 error
= mpt_config(ioc
, &cfg
);
2459 goto out_free_consistent
;
2461 mptsas_print_phy_pg0(ioc
, buffer
);
2463 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2464 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2465 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2466 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2468 out_free_consistent
:
2469 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2470 buffer
, dma_handle
);
2476 mptsas_sas_device_pg0(MPT_ADAPTER
*ioc
, struct mptsas_devinfo
*device_info
,
2477 u32 form
, u32 form_specific
)
2479 ConfigExtendedPageHeader_t hdr
;
2481 SasDevicePage0_t
*buffer
;
2482 dma_addr_t dma_handle
;
2486 hdr
.PageVersion
= MPI_SASDEVICE0_PAGEVERSION
;
2487 hdr
.ExtPageLength
= 0;
2491 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2492 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE
;
2494 cfg
.cfghdr
.ehdr
= &hdr
;
2495 cfg
.pageAddr
= form
+ form_specific
;
2497 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2498 cfg
.dir
= 0; /* read */
2499 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2501 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2502 error
= mpt_config(ioc
, &cfg
);
2505 if (!hdr
.ExtPageLength
) {
2510 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2517 cfg
.physAddr
= dma_handle
;
2518 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2520 error
= mpt_config(ioc
, &cfg
);
2522 goto out_free_consistent
;
2524 mptsas_print_device_pg0(ioc
, buffer
);
2526 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2527 device_info
->handle
= le16_to_cpu(buffer
->DevHandle
);
2528 device_info
->handle_parent
= le16_to_cpu(buffer
->ParentDevHandle
);
2529 device_info
->handle_enclosure
=
2530 le16_to_cpu(buffer
->EnclosureHandle
);
2531 device_info
->slot
= le16_to_cpu(buffer
->Slot
);
2532 device_info
->phy_id
= buffer
->PhyNum
;
2533 device_info
->port_id
= buffer
->PhysicalPort
;
2534 device_info
->id
= buffer
->TargetID
;
2535 device_info
->phys_disk_num
= ~0;
2536 device_info
->channel
= buffer
->Bus
;
2537 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2538 device_info
->sas_address
= le64_to_cpu(sas_address
);
2539 device_info
->device_info
=
2540 le32_to_cpu(buffer
->DeviceInfo
);
2542 out_free_consistent
:
2543 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2544 buffer
, dma_handle
);
2550 mptsas_sas_expander_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
,
2551 u32 form
, u32 form_specific
)
2553 ConfigExtendedPageHeader_t hdr
;
2555 SasExpanderPage0_t
*buffer
;
2556 dma_addr_t dma_handle
;
2560 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2561 hdr
.PageVersion
= MPI_SASEXPANDER0_PAGEVERSION
;
2562 hdr
.ExtPageLength
= 0;
2566 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2567 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2569 cfg
.cfghdr
.ehdr
= &hdr
;
2571 cfg
.pageAddr
= form
+ form_specific
;
2572 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2573 cfg
.dir
= 0; /* read */
2574 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2576 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2577 error
= mpt_config(ioc
, &cfg
);
2581 if (!hdr
.ExtPageLength
) {
2586 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2593 cfg
.physAddr
= dma_handle
;
2594 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2596 error
= mpt_config(ioc
, &cfg
);
2598 goto out_free_consistent
;
2600 if (!buffer
->NumPhys
) {
2602 goto out_free_consistent
;
2605 /* save config data */
2606 port_info
->num_phys
= (buffer
->NumPhys
) ? buffer
->NumPhys
: 1;
2607 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2608 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2609 if (!port_info
->phy_info
) {
2611 goto out_free_consistent
;
2614 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2615 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2616 port_info
->phy_info
[i
].portinfo
= port_info
;
2617 port_info
->phy_info
[i
].handle
=
2618 le16_to_cpu(buffer
->DevHandle
);
2619 port_info
->phy_info
[i
].identify
.sas_address
=
2620 le64_to_cpu(sas_address
);
2621 port_info
->phy_info
[i
].identify
.handle_parent
=
2622 le16_to_cpu(buffer
->ParentDevHandle
);
2625 out_free_consistent
:
2626 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2627 buffer
, dma_handle
);
2633 mptsas_sas_expander_pg1(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2634 u32 form
, u32 form_specific
)
2636 ConfigExtendedPageHeader_t hdr
;
2638 SasExpanderPage1_t
*buffer
;
2639 dma_addr_t dma_handle
;
2642 hdr
.PageVersion
= MPI_SASEXPANDER1_PAGEVERSION
;
2643 hdr
.ExtPageLength
= 0;
2647 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2648 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2650 cfg
.cfghdr
.ehdr
= &hdr
;
2652 cfg
.pageAddr
= form
+ form_specific
;
2653 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2654 cfg
.dir
= 0; /* read */
2655 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2657 error
= mpt_config(ioc
, &cfg
);
2661 if (!hdr
.ExtPageLength
) {
2666 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2673 cfg
.physAddr
= dma_handle
;
2674 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2676 error
= mpt_config(ioc
, &cfg
);
2678 if (error
== MPI_IOCSTATUS_CONFIG_INVALID_PAGE
) {
2684 goto out_free_consistent
;
2687 mptsas_print_expander_pg1(ioc
, buffer
);
2689 /* save config data */
2690 phy_info
->phy_id
= buffer
->PhyIdentifier
;
2691 phy_info
->port_id
= buffer
->PhysicalPort
;
2692 phy_info
->negotiated_link_rate
= buffer
->NegotiatedLinkRate
;
2693 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2694 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2695 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2696 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2698 out_free_consistent
:
2699 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2700 buffer
, dma_handle
);
2705 struct rep_manu_request
{
2712 struct rep_manu_reply
{
2713 u8 smp_frame_type
; /* 0x41 */
2714 u8 function
; /* 0x01 */
2717 u16 expander_change_count
;
2722 u8 vendor_id
[SAS_EXPANDER_VENDOR_ID_LEN
];
2723 u8 product_id
[SAS_EXPANDER_PRODUCT_ID_LEN
];
2724 u8 product_rev
[SAS_EXPANDER_PRODUCT_REV_LEN
];
2725 u8 component_vendor_id
[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN
];
2727 u8 component_revision_id
;
2729 u8 vendor_specific
[8];
2733 * mptsas_exp_repmanufacture_info -
2734 * @ioc: per adapter object
2735 * @sas_address: expander sas address
2736 * @edev: the sas_expander_device object
2738 * Fills in the sas_expander_device object when SMP port is created.
2740 * Returns 0 for success, non-zero for failure.
2743 mptsas_exp_repmanufacture_info(MPT_ADAPTER
*ioc
,
2744 u64 sas_address
, struct sas_expander_device
*edev
)
2747 SmpPassthroughRequest_t
*smpreq
;
2748 SmpPassthroughReply_t
*smprep
;
2749 struct rep_manu_reply
*manufacture_reply
;
2750 struct rep_manu_request
*manufacture_request
;
2753 unsigned long timeleft
;
2755 unsigned long flags
;
2756 void *data_out
= NULL
;
2757 dma_addr_t data_out_dma
= 0;
2760 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
2761 if (ioc
->ioc_reset_in_progress
) {
2762 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
2763 printk(MYIOC_s_INFO_FMT
"%s: host reset in progress!\n",
2764 __func__
, ioc
->name
);
2767 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
2769 ret
= mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
);
2773 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2779 smpreq
= (SmpPassthroughRequest_t
*)mf
;
2780 memset(smpreq
, 0, sizeof(*smpreq
));
2782 sz
= sizeof(struct rep_manu_request
) + sizeof(struct rep_manu_reply
);
2784 data_out
= pci_alloc_consistent(ioc
->pcidev
, sz
, &data_out_dma
);
2786 printk(KERN_ERR
"Memory allocation failure at %s:%d/%s()!\n",
2787 __FILE__
, __LINE__
, __func__
);
2792 manufacture_request
= data_out
;
2793 manufacture_request
->smp_frame_type
= 0x40;
2794 manufacture_request
->function
= 1;
2795 manufacture_request
->reserved
= 0;
2796 manufacture_request
->request_length
= 0;
2798 smpreq
->Function
= MPI_FUNCTION_SMP_PASSTHROUGH
;
2799 smpreq
->PhysicalPort
= 0xFF;
2800 *((u64
*)&smpreq
->SASAddress
) = cpu_to_le64(sas_address
);
2801 smpreq
->RequestDataLength
= sizeof(struct rep_manu_request
);
2804 (((int *) mf
) + (offsetof(SmpPassthroughRequest_t
, SGL
) / 4));
2806 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2807 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2808 MPI_SGE_FLAGS_HOST_TO_IOC
|
2809 MPI_SGE_FLAGS_END_OF_BUFFER
;
2810 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2811 flagsLength
|= sizeof(struct rep_manu_request
);
2813 ioc
->add_sge(psge
, flagsLength
, data_out_dma
);
2814 psge
+= ioc
->SGE_size
;
2816 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2817 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2818 MPI_SGE_FLAGS_IOC_TO_HOST
|
2819 MPI_SGE_FLAGS_END_OF_BUFFER
;
2820 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2821 flagsLength
|= sizeof(struct rep_manu_reply
);
2822 ioc
->add_sge(psge
, flagsLength
, data_out_dma
+
2823 sizeof(struct rep_manu_request
));
2825 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2826 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2828 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
, 10 * HZ
);
2829 if (!(ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
2831 mpt_free_msg_frame(ioc
, mf
);
2833 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
2836 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
2842 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_RF_VALID
) {
2845 smprep
= (SmpPassthroughReply_t
*)ioc
->sas_mgmt
.reply
;
2846 if (le16_to_cpu(smprep
->ResponseDataLength
) !=
2847 sizeof(struct rep_manu_reply
))
2850 manufacture_reply
= data_out
+ sizeof(struct rep_manu_request
);
2851 strncpy(edev
->vendor_id
, manufacture_reply
->vendor_id
,
2852 SAS_EXPANDER_VENDOR_ID_LEN
);
2853 strncpy(edev
->product_id
, manufacture_reply
->product_id
,
2854 SAS_EXPANDER_PRODUCT_ID_LEN
);
2855 strncpy(edev
->product_rev
, manufacture_reply
->product_rev
,
2856 SAS_EXPANDER_PRODUCT_REV_LEN
);
2857 edev
->level
= manufacture_reply
->sas_format
;
2858 if (manufacture_reply
->sas_format
) {
2859 strncpy(edev
->component_vendor_id
,
2860 manufacture_reply
->component_vendor_id
,
2861 SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN
);
2862 tmp
= (u8
*)&manufacture_reply
->component_id
;
2863 edev
->component_id
= tmp
[0] << 8 | tmp
[1];
2864 edev
->component_revision_id
=
2865 manufacture_reply
->component_revision_id
;
2868 printk(MYIOC_s_ERR_FMT
2869 "%s: smp passthru reply failed to be returned\n",
2870 ioc
->name
, __func__
);
2875 pci_free_consistent(ioc
->pcidev
, sz
, data_out
, data_out_dma
);
2878 mpt_free_msg_frame(ioc
, mf
);
2880 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2881 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2887 mptsas_parse_device_info(struct sas_identify
*identify
,
2888 struct mptsas_devinfo
*device_info
)
2892 identify
->sas_address
= device_info
->sas_address
;
2893 identify
->phy_identifier
= device_info
->phy_id
;
2896 * Fill in Phy Initiator Port Protocol.
2897 * Bits 6:3, more than one bit can be set, fall through cases.
2899 protocols
= device_info
->device_info
& 0x78;
2900 identify
->initiator_port_protocols
= 0;
2901 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_INITIATOR
)
2902 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SSP
;
2903 if (protocols
& MPI_SAS_DEVICE_INFO_STP_INITIATOR
)
2904 identify
->initiator_port_protocols
|= SAS_PROTOCOL_STP
;
2905 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_INITIATOR
)
2906 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SMP
;
2907 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_HOST
)
2908 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SATA
;
2911 * Fill in Phy Target Port Protocol.
2912 * Bits 10:7, more than one bit can be set, fall through cases.
2914 protocols
= device_info
->device_info
& 0x780;
2915 identify
->target_port_protocols
= 0;
2916 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_TARGET
)
2917 identify
->target_port_protocols
|= SAS_PROTOCOL_SSP
;
2918 if (protocols
& MPI_SAS_DEVICE_INFO_STP_TARGET
)
2919 identify
->target_port_protocols
|= SAS_PROTOCOL_STP
;
2920 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_TARGET
)
2921 identify
->target_port_protocols
|= SAS_PROTOCOL_SMP
;
2922 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
2923 identify
->target_port_protocols
|= SAS_PROTOCOL_SATA
;
2926 * Fill in Attached device type.
2928 switch (device_info
->device_info
&
2929 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE
) {
2930 case MPI_SAS_DEVICE_INFO_NO_DEVICE
:
2931 identify
->device_type
= SAS_PHY_UNUSED
;
2933 case MPI_SAS_DEVICE_INFO_END_DEVICE
:
2934 identify
->device_type
= SAS_END_DEVICE
;
2936 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
:
2937 identify
->device_type
= SAS_EDGE_EXPANDER_DEVICE
;
2939 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
:
2940 identify
->device_type
= SAS_FANOUT_EXPANDER_DEVICE
;
2945 static int mptsas_probe_one_phy(struct device
*dev
,
2946 struct mptsas_phyinfo
*phy_info
, int index
, int local
)
2949 struct sas_phy
*phy
;
2950 struct sas_port
*port
;
2958 if (!phy_info
->phy
) {
2959 phy
= sas_phy_alloc(dev
, index
);
2965 phy
= phy_info
->phy
;
2967 mptsas_parse_device_info(&phy
->identify
, &phy_info
->identify
);
2970 * Set Negotiated link rate.
2972 switch (phy_info
->negotiated_link_rate
) {
2973 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
:
2974 phy
->negotiated_linkrate
= SAS_PHY_DISABLED
;
2976 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
:
2977 phy
->negotiated_linkrate
= SAS_LINK_RATE_FAILED
;
2979 case MPI_SAS_IOUNIT0_RATE_1_5
:
2980 phy
->negotiated_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
2982 case MPI_SAS_IOUNIT0_RATE_3_0
:
2983 phy
->negotiated_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
2985 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE
:
2986 case MPI_SAS_IOUNIT0_RATE_UNKNOWN
:
2988 phy
->negotiated_linkrate
= SAS_LINK_RATE_UNKNOWN
;
2993 * Set Max hardware link rate.
2995 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
2996 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5
:
2997 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
2999 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
3000 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
3007 * Set Max programmed link rate.
3009 switch (phy_info
->programmed_link_rate
&
3010 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
3011 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5
:
3012 phy
->maximum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
3014 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
3015 phy
->maximum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
3022 * Set Min hardware link rate.
3024 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK
) {
3025 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5
:
3026 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
3028 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
3029 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
3036 * Set Min programmed link rate.
3038 switch (phy_info
->programmed_link_rate
&
3039 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK
) {
3040 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5
:
3041 phy
->minimum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
3043 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
3044 phy
->minimum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
3050 if (!phy_info
->phy
) {
3052 error
= sas_phy_add(phy
);
3057 phy_info
->phy
= phy
;
3060 if (!phy_info
->attached
.handle
||
3061 !phy_info
->port_details
)
3064 port
= mptsas_get_port(phy_info
);
3065 ioc
= phy_to_ioc(phy_info
->phy
);
3067 if (phy_info
->sas_port_add_phy
) {
3070 port
= sas_port_alloc_num(dev
);
3075 error
= sas_port_add(port
);
3077 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3078 "%s: exit at line=%d\n", ioc
->name
,
3079 __func__
, __LINE__
));
3082 mptsas_set_port(ioc
, phy_info
, port
);
3083 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &port
->dev
,
3084 MYIOC_s_FMT
"add port %d, sas_addr (0x%llx)\n",
3085 ioc
->name
, port
->port_identifier
,
3086 (unsigned long long)phy_info
->
3087 attached
.sas_address
));
3089 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3090 "sas_port_add_phy: phy_id=%d\n",
3091 ioc
->name
, phy_info
->phy_id
));
3092 sas_port_add_phy(port
, phy_info
->phy
);
3093 phy_info
->sas_port_add_phy
= 0;
3094 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
3095 MYIOC_s_FMT
"add phy %d, phy-obj (0x%p)\n", ioc
->name
,
3096 phy_info
->phy_id
, phy_info
->phy
));
3098 if (!mptsas_get_rphy(phy_info
) && port
&& !port
->rphy
) {
3100 struct sas_rphy
*rphy
;
3101 struct device
*parent
;
3102 struct sas_identify identify
;
3104 parent
= dev
->parent
->parent
;
3106 * Let the hotplug_work thread handle processing
3107 * the adding/removing of devices that occur
3108 * after start of day.
3110 if (mptsas_is_end_device(&phy_info
->attached
) &&
3111 phy_info
->attached
.handle_parent
) {
3115 mptsas_parse_device_info(&identify
, &phy_info
->attached
);
3116 if (scsi_is_host_device(parent
)) {
3117 struct mptsas_portinfo
*port_info
;
3120 port_info
= ioc
->hba_port_info
;
3122 for (i
= 0; i
< port_info
->num_phys
; i
++)
3123 if (port_info
->phy_info
[i
].identify
.sas_address
==
3124 identify
.sas_address
) {
3125 sas_port_mark_backlink(port
);
3129 } else if (scsi_is_sas_rphy(parent
)) {
3130 struct sas_rphy
*parent_rphy
= dev_to_rphy(parent
);
3131 if (identify
.sas_address
==
3132 parent_rphy
->identify
.sas_address
) {
3133 sas_port_mark_backlink(port
);
3138 switch (identify
.device_type
) {
3139 case SAS_END_DEVICE
:
3140 rphy
= sas_end_device_alloc(port
);
3142 case SAS_EDGE_EXPANDER_DEVICE
:
3143 case SAS_FANOUT_EXPANDER_DEVICE
:
3144 rphy
= sas_expander_alloc(port
, identify
.device_type
);
3151 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3152 "%s: exit at line=%d\n", ioc
->name
,
3153 __func__
, __LINE__
));
3157 rphy
->identify
= identify
;
3158 error
= sas_rphy_add(rphy
);
3160 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3161 "%s: exit at line=%d\n", ioc
->name
,
3162 __func__
, __LINE__
));
3163 sas_rphy_free(rphy
);
3166 mptsas_set_rphy(ioc
, phy_info
, rphy
);
3167 if (identify
.device_type
== SAS_EDGE_EXPANDER_DEVICE
||
3168 identify
.device_type
== SAS_FANOUT_EXPANDER_DEVICE
)
3169 mptsas_exp_repmanufacture_info(ioc
,
3170 identify
.sas_address
,
3171 rphy_to_expander_device(rphy
));
3179 mptsas_probe_hba_phys(MPT_ADAPTER
*ioc
)
3181 struct mptsas_portinfo
*port_info
, *hba
;
3182 int error
= -ENOMEM
, i
;
3184 hba
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3188 error
= mptsas_sas_io_unit_pg0(ioc
, hba
);
3190 goto out_free_port_info
;
3192 mptsas_sas_io_unit_pg1(ioc
);
3193 mutex_lock(&ioc
->sas_topology_mutex
);
3194 port_info
= ioc
->hba_port_info
;
3196 ioc
->hba_port_info
= port_info
= hba
;
3197 ioc
->hba_port_num_phy
= port_info
->num_phys
;
3198 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3200 for (i
= 0; i
< hba
->num_phys
; i
++) {
3201 port_info
->phy_info
[i
].negotiated_link_rate
=
3202 hba
->phy_info
[i
].negotiated_link_rate
;
3203 port_info
->phy_info
[i
].handle
=
3204 hba
->phy_info
[i
].handle
;
3205 port_info
->phy_info
[i
].port_id
=
3206 hba
->phy_info
[i
].port_id
;
3208 kfree(hba
->phy_info
);
3212 mutex_unlock(&ioc
->sas_topology_mutex
);
3213 #if defined(CPQ_CIM)
3214 ioc
->num_ports
= port_info
->num_phys
;
3216 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3217 mptsas_sas_phy_pg0(ioc
, &port_info
->phy_info
[i
],
3218 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER
<<
3219 MPI_SAS_PHY_PGAD_FORM_SHIFT
), i
);
3220 port_info
->phy_info
[i
].identify
.handle
=
3221 port_info
->phy_info
[i
].handle
;
3222 mptsas_sas_device_pg0(ioc
, &port_info
->phy_info
[i
].identify
,
3223 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3224 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3225 port_info
->phy_info
[i
].identify
.handle
);
3226 if (!ioc
->hba_port_sas_addr
)
3227 ioc
->hba_port_sas_addr
=
3228 port_info
->phy_info
[i
].identify
.sas_address
;
3229 port_info
->phy_info
[i
].identify
.phy_id
=
3230 port_info
->phy_info
[i
].phy_id
= i
;
3231 if (port_info
->phy_info
[i
].attached
.handle
)
3232 mptsas_sas_device_pg0(ioc
,
3233 &port_info
->phy_info
[i
].attached
,
3234 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3235 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3236 port_info
->phy_info
[i
].attached
.handle
);
3239 mptsas_setup_wide_ports(ioc
, port_info
);
3241 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3242 mptsas_probe_one_phy(&ioc
->sh
->shost_gendev
,
3243 &port_info
->phy_info
[i
], ioc
->sas_index
, 1);
3254 mptsas_expander_refresh(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
3256 struct mptsas_portinfo
*parent
;
3257 struct device
*parent_dev
;
3258 struct sas_rphy
*rphy
;
3260 u64 sas_address
; /* expander sas address */
3263 handle
= port_info
->phy_info
[0].handle
;
3264 sas_address
= port_info
->phy_info
[0].identify
.sas_address
;
3265 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3266 mptsas_sas_expander_pg1(ioc
, &port_info
->phy_info
[i
],
3267 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM
<<
3268 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), (i
<< 16) + handle
);
3270 mptsas_sas_device_pg0(ioc
,
3271 &port_info
->phy_info
[i
].identify
,
3272 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3273 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3274 port_info
->phy_info
[i
].identify
.handle
);
3275 port_info
->phy_info
[i
].identify
.phy_id
=
3276 port_info
->phy_info
[i
].phy_id
;
3278 if (port_info
->phy_info
[i
].attached
.handle
) {
3279 mptsas_sas_device_pg0(ioc
,
3280 &port_info
->phy_info
[i
].attached
,
3281 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3282 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3283 port_info
->phy_info
[i
].attached
.handle
);
3284 port_info
->phy_info
[i
].attached
.phy_id
=
3285 port_info
->phy_info
[i
].phy_id
;
3289 mutex_lock(&ioc
->sas_topology_mutex
);
3290 parent
= mptsas_find_portinfo_by_handle(ioc
,
3291 port_info
->phy_info
[0].identify
.handle_parent
);
3293 mutex_unlock(&ioc
->sas_topology_mutex
);
3296 for (i
= 0, parent_dev
= NULL
; i
< parent
->num_phys
&& !parent_dev
;
3298 if (parent
->phy_info
[i
].attached
.sas_address
== sas_address
) {
3299 rphy
= mptsas_get_rphy(&parent
->phy_info
[i
]);
3300 parent_dev
= &rphy
->dev
;
3303 mutex_unlock(&ioc
->sas_topology_mutex
);
3305 mptsas_setup_wide_ports(ioc
, port_info
);
3306 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3307 mptsas_probe_one_phy(parent_dev
, &port_info
->phy_info
[i
],
3312 mptsas_expander_event_add(MPT_ADAPTER
*ioc
,
3313 MpiEventDataSasExpanderStatusChange_t
*expander_data
)
3315 struct mptsas_portinfo
*port_info
;
3319 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3322 port_info
->num_phys
= (expander_data
->NumPhys
) ?
3323 expander_data
->NumPhys
: 1;
3324 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
3325 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
3326 if (!port_info
->phy_info
)
3328 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3329 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3330 port_info
->phy_info
[i
].portinfo
= port_info
;
3331 port_info
->phy_info
[i
].handle
=
3332 le16_to_cpu(expander_data
->DevHandle
);
3333 port_info
->phy_info
[i
].identify
.sas_address
=
3334 le64_to_cpu(sas_address
);
3335 port_info
->phy_info
[i
].identify
.handle_parent
=
3336 le16_to_cpu(expander_data
->ParentDevHandle
);
3339 mutex_lock(&ioc
->sas_topology_mutex
);
3340 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3341 mutex_unlock(&ioc
->sas_topology_mutex
);
3343 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3344 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3345 (unsigned long long)sas_address
);
3347 mptsas_expander_refresh(ioc
, port_info
);
3351 * mptsas_delete_expander_siblings - remove siblings attached to expander
3352 * @ioc: Pointer to MPT_ADAPTER structure
3353 * @parent: the parent port_info object
3354 * @expander: the expander port_info object
3357 mptsas_delete_expander_siblings(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
3358 *parent
, struct mptsas_portinfo
*expander
)
3360 struct mptsas_phyinfo
*phy_info
;
3361 struct mptsas_portinfo
*port_info
;
3362 struct sas_rphy
*rphy
;
3365 phy_info
= expander
->phy_info
;
3366 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3367 rphy
= mptsas_get_rphy(phy_info
);
3370 if (rphy
->identify
.device_type
== SAS_END_DEVICE
)
3371 mptsas_del_end_device(ioc
, phy_info
);
3374 phy_info
= expander
->phy_info
;
3375 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3376 rphy
= mptsas_get_rphy(phy_info
);
3379 if (rphy
->identify
.device_type
==
3380 MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
||
3381 rphy
->identify
.device_type
==
3382 MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
) {
3383 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3384 rphy
->identify
.sas_address
);
3387 if (port_info
== parent
) /* backlink rphy */
3390 Delete this expander even if the expdevpage is exists
3391 because the parent expander is already deleted
3393 mptsas_expander_delete(ioc
, port_info
, 1);
3400 * mptsas_expander_delete - remove this expander
3401 * @ioc: Pointer to MPT_ADAPTER structure
3402 * @port_info: expander port_info struct
3403 * @force: Flag to forcefully delete the expander
3407 static void mptsas_expander_delete(MPT_ADAPTER
*ioc
,
3408 struct mptsas_portinfo
*port_info
, u8 force
)
3411 struct mptsas_portinfo
*parent
;
3413 u64 expander_sas_address
;
3414 struct mptsas_phyinfo
*phy_info
;
3415 struct mptsas_portinfo buffer
;
3416 struct mptsas_portinfo_details
*port_details
;
3417 struct sas_port
*port
;
3422 /* see if expander is still there before deleting */
3423 mptsas_sas_expander_pg0(ioc
, &buffer
,
3424 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3425 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
),
3426 port_info
->phy_info
[0].identify
.handle
);
3428 if (buffer
.num_phys
) {
3429 kfree(buffer
.phy_info
);
3436 * Obtain the port_info instance to the parent port
3438 port_details
= NULL
;
3439 expander_sas_address
=
3440 port_info
->phy_info
[0].identify
.sas_address
;
3441 parent
= mptsas_find_portinfo_by_handle(ioc
,
3442 port_info
->phy_info
[0].identify
.handle_parent
);
3443 mptsas_delete_expander_siblings(ioc
, parent
, port_info
);
3448 * Delete rphys in the parent that point
3451 phy_info
= parent
->phy_info
;
3453 for (i
= 0; i
< parent
->num_phys
; i
++, phy_info
++) {
3456 if (phy_info
->attached
.sas_address
!=
3457 expander_sas_address
)
3460 port
= mptsas_get_port(phy_info
);
3461 port_details
= phy_info
->port_details
;
3463 dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
3464 MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n", ioc
->name
,
3465 phy_info
->phy_id
, phy_info
->phy
);
3466 sas_port_delete_phy(port
, phy_info
->phy
);
3469 dev_printk(KERN_DEBUG
, &port
->dev
,
3470 MYIOC_s_FMT
"delete port %d, sas_addr (0x%llx)\n",
3471 ioc
->name
, port
->port_identifier
,
3472 (unsigned long long)expander_sas_address
);
3473 sas_port_delete(port
);
3474 mptsas_port_delete(ioc
, port_details
);
3478 printk(MYIOC_s_INFO_FMT
"delete expander: num_phys %d, "
3479 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3480 (unsigned long long)expander_sas_address
);
3485 list_del(&port_info
->list
);
3486 kfree(port_info
->phy_info
);
3492 * mptsas_send_expander_event - expanders events
3493 * @ioc: Pointer to MPT_ADAPTER structure
3494 * @expander_data: event data
3497 * This function handles adding, removing, and refreshing
3498 * device handles within the expander objects.
3501 mptsas_send_expander_event(struct fw_event_work
*fw_event
)
3504 MpiEventDataSasExpanderStatusChange_t
*expander_data
;
3505 struct mptsas_portinfo
*port_info
;
3509 ioc
= fw_event
->ioc
;
3510 expander_data
= (MpiEventDataSasExpanderStatusChange_t
*)
3511 fw_event
->event_data
;
3512 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3513 sas_address
= le64_to_cpu(sas_address
);
3514 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3516 if (expander_data
->ReasonCode
== MPI_EVENT_SAS_EXP_RC_ADDED
) {
3518 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3519 port_info
->phy_info
[i
].portinfo
= port_info
;
3520 port_info
->phy_info
[i
].handle
=
3521 le16_to_cpu(expander_data
->DevHandle
);
3522 port_info
->phy_info
[i
].identify
.sas_address
=
3523 le64_to_cpu(sas_address
);
3524 port_info
->phy_info
[i
].identify
.handle_parent
=
3525 le16_to_cpu(expander_data
->ParentDevHandle
);
3527 mptsas_expander_refresh(ioc
, port_info
);
3528 } else if (!port_info
&& expander_data
->NumPhys
)
3529 mptsas_expander_event_add(ioc
, expander_data
);
3530 } else if (expander_data
->ReasonCode
==
3531 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
)
3532 mptsas_expander_delete(ioc
, port_info
, 0);
3534 mptsas_free_fw_event(ioc
, fw_event
);
3539 * mptsas_expander_add -
3540 * @ioc: Pointer to MPT_ADAPTER structure
3544 struct mptsas_portinfo
*
3545 mptsas_expander_add(MPT_ADAPTER
*ioc
, u16 handle
)
3547 struct mptsas_portinfo buffer
, *port_info
;
3550 if ((mptsas_sas_expander_pg0(ioc
, &buffer
,
3551 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3552 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)))
3555 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_ATOMIC
);
3557 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3558 "%s: exit at line=%d\n", ioc
->name
,
3559 __func__
, __LINE__
));
3562 port_info
->num_phys
= buffer
.num_phys
;
3563 port_info
->phy_info
= buffer
.phy_info
;
3564 for (i
= 0; i
< port_info
->num_phys
; i
++)
3565 port_info
->phy_info
[i
].portinfo
= port_info
;
3566 mutex_lock(&ioc
->sas_topology_mutex
);
3567 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3568 mutex_unlock(&ioc
->sas_topology_mutex
);
3569 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3570 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3571 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3572 mptsas_expander_refresh(ioc
, port_info
);
3577 mptsas_send_link_status_event(struct fw_event_work
*fw_event
)
3580 MpiEventDataSasPhyLinkStatus_t
*link_data
;
3581 struct mptsas_portinfo
*port_info
;
3582 struct mptsas_phyinfo
*phy_info
= NULL
;
3587 ioc
= fw_event
->ioc
;
3588 link_data
= (MpiEventDataSasPhyLinkStatus_t
*)fw_event
->event_data
;
3590 memcpy(&sas_address
, &link_data
->SASAddress
, sizeof(__le64
));
3591 sas_address
= le64_to_cpu(sas_address
);
3592 link_rate
= link_data
->LinkRates
>> 4;
3593 phy_num
= link_data
->PhyNum
;
3595 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3597 phy_info
= &port_info
->phy_info
[phy_num
];
3599 phy_info
->negotiated_link_rate
= link_rate
;
3602 if (link_rate
== MPI_SAS_IOUNIT0_RATE_1_5
||
3603 link_rate
== MPI_SAS_IOUNIT0_RATE_3_0
) {
3606 if (ioc
->old_sas_discovery_protocal
) {
3607 port_info
= mptsas_expander_add(ioc
,
3608 le16_to_cpu(link_data
->DevHandle
));
3615 if (port_info
== ioc
->hba_port_info
)
3616 mptsas_probe_hba_phys(ioc
);
3618 mptsas_expander_refresh(ioc
, port_info
);
3619 } else if (phy_info
&& phy_info
->phy
) {
3620 if (link_rate
== MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
)
3621 phy_info
->phy
->negotiated_linkrate
=
3623 else if (link_rate
==
3624 MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
)
3625 phy_info
->phy
->negotiated_linkrate
=
3626 SAS_LINK_RATE_FAILED
;
3628 phy_info
->phy
->negotiated_linkrate
=
3629 SAS_LINK_RATE_UNKNOWN
;
3632 mptsas_free_fw_event(ioc
, fw_event
);
3636 mptsas_not_responding_devices(MPT_ADAPTER
*ioc
)
3638 struct mptsas_portinfo buffer
, *port_info
;
3639 struct mptsas_device_info
*sas_info
;
3640 struct mptsas_devinfo sas_device
;
3642 VirtTarget
*vtarget
= NULL
;
3643 struct mptsas_phyinfo
*phy_info
;
3645 int retval
, retry_count
;
3646 unsigned long flags
;
3648 mpt_findImVolumes(ioc
);
3650 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3651 if (ioc
->ioc_reset_in_progress
) {
3652 dfailprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3653 "%s: exiting due to a parallel reset \n", ioc
->name
,
3655 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3658 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3660 /* devices, logical volumes */
3661 mutex_lock(&ioc
->sas_device_info_mutex
);
3663 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
, list
) {
3664 if (sas_info
->is_cached
)
3666 if (!sas_info
->is_logical_volume
) {
3667 sas_device
.handle
= 0;
3670 retval
= mptsas_sas_device_pg0(ioc
, &sas_device
,
3671 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
3672 << MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3673 (sas_info
->fw
.channel
<< 8) +
3676 if (sas_device
.handle
)
3678 if (retval
== -EBUSY
) {
3679 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3680 if (ioc
->ioc_reset_in_progress
) {
3682 printk(MYIOC_s_DEBUG_FMT
3683 "%s: exiting due to reset\n",
3684 ioc
->name
, __func__
));
3685 spin_unlock_irqrestore
3686 (&ioc
->taskmgmt_lock
, flags
);
3688 sas_device_info_mutex
);
3691 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
,
3695 if (retval
&& (retval
!= -ENODEV
)) {
3696 if (retry_count
< 10) {
3700 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3701 "%s: Config page retry exceeded retry "
3702 "count deleting device 0x%llx\n",
3703 ioc
->name
, __func__
,
3704 sas_info
->sas_address
));
3709 vtarget
= mptsas_find_vtarget(ioc
,
3710 sas_info
->fw
.channel
, sas_info
->fw
.id
);
3713 vtarget
->deleted
= 1;
3715 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
3716 sas_info
->sas_address
);
3719 mptsas_del_end_device(ioc
, phy_info
);
3720 goto redo_device_scan
;
3723 mptsas_volume_delete(ioc
, sas_info
->fw
.id
);
3725 mutex_unlock(&ioc
->sas_device_info_mutex
);
3728 mutex_lock(&ioc
->sas_topology_mutex
);
3730 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3732 if (port_info
->phy_info
&&
3733 (!(port_info
->phy_info
[0].identify
.device_info
&
3734 MPI_SAS_DEVICE_INFO_SMP_TARGET
)))
3738 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3739 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3740 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
) &&
3743 handle
= buffer
.phy_info
[0].handle
;
3744 if (buffer
.phy_info
[0].identify
.sas_address
==
3745 port_info
->phy_info
[0].identify
.sas_address
) {
3748 kfree(buffer
.phy_info
);
3751 if (!found_expander
) {
3752 mptsas_expander_delete(ioc
, port_info
, 0);
3753 goto redo_expander_scan
;
3756 mutex_unlock(&ioc
->sas_topology_mutex
);
3760 * mptsas_probe_expanders - adding expanders
3761 * @ioc: Pointer to MPT_ADAPTER structure
3765 mptsas_probe_expanders(MPT_ADAPTER
*ioc
)
3767 struct mptsas_portinfo buffer
, *port_info
;
3772 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3773 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3774 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)) {
3776 handle
= buffer
.phy_info
[0].handle
;
3777 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3778 buffer
.phy_info
[0].identify
.sas_address
);
3781 /* refreshing handles */
3782 for (i
= 0; i
< buffer
.num_phys
; i
++) {
3783 port_info
->phy_info
[i
].handle
= handle
;
3784 port_info
->phy_info
[i
].identify
.handle_parent
=
3785 buffer
.phy_info
[0].identify
.handle_parent
;
3787 mptsas_expander_refresh(ioc
, port_info
);
3788 kfree(buffer
.phy_info
);
3792 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3794 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3795 "%s: exit at line=%d\n", ioc
->name
,
3796 __func__
, __LINE__
));
3799 port_info
->num_phys
= buffer
.num_phys
;
3800 port_info
->phy_info
= buffer
.phy_info
;
3801 for (i
= 0; i
< port_info
->num_phys
; i
++)
3802 port_info
->phy_info
[i
].portinfo
= port_info
;
3803 mutex_lock(&ioc
->sas_topology_mutex
);
3804 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3805 mutex_unlock(&ioc
->sas_topology_mutex
);
3806 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3807 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3808 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3809 mptsas_expander_refresh(ioc
, port_info
);
3814 mptsas_probe_devices(MPT_ADAPTER
*ioc
)
3817 struct mptsas_devinfo sas_device
;
3818 struct mptsas_phyinfo
*phy_info
;
3821 while (!(mptsas_sas_device_pg0(ioc
, &sas_device
,
3822 MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE
, handle
))) {
3824 handle
= sas_device
.handle
;
3826 if ((sas_device
.device_info
&
3827 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
3828 MPI_SAS_DEVICE_INFO_STP_TARGET
|
3829 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0)
3832 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
3836 if (mptsas_get_rphy(phy_info
))
3839 mptsas_add_end_device(ioc
, phy_info
);
3844 * mptsas_scan_sas_topology -
3845 * @ioc: Pointer to MPT_ADAPTER structure
3850 mptsas_scan_sas_topology(MPT_ADAPTER
*ioc
)
3852 struct scsi_device
*sdev
;
3855 mptsas_probe_hba_phys(ioc
);
3856 mptsas_probe_expanders(ioc
);
3857 mptsas_probe_devices(ioc
);
3860 Reporting RAID volumes.
3862 if (!ioc
->ir_firmware
|| !ioc
->raid_data
.pIocPg2
||
3863 !ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
3865 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
3866 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3867 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3869 scsi_device_put(sdev
);
3872 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
3873 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
3874 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
);
3875 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3876 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3882 mptsas_handle_queue_full_event(struct fw_event_work
*fw_event
)
3885 EventDataQueueFull_t
*qfull_data
;
3886 struct mptsas_device_info
*sas_info
;
3887 struct scsi_device
*sdev
;
3891 int fw_id
, fw_channel
;
3895 ioc
= fw_event
->ioc
;
3896 qfull_data
= (EventDataQueueFull_t
*)fw_event
->event_data
;
3897 fw_id
= qfull_data
->TargetID
;
3898 fw_channel
= qfull_data
->Bus
;
3899 current_depth
= le16_to_cpu(qfull_data
->CurrentDepth
);
3901 /* if hidden raid component, look for the volume id */
3902 mutex_lock(&ioc
->sas_device_info_mutex
);
3903 if (mptscsih_is_phys_disk(ioc
, fw_channel
, fw_id
)) {
3904 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3906 if (sas_info
->is_cached
||
3907 sas_info
->is_logical_volume
)
3909 if (sas_info
->is_hidden_raid_component
&&
3910 (sas_info
->fw
.channel
== fw_channel
&&
3911 sas_info
->fw
.id
== fw_id
)) {
3912 id
= sas_info
->volume_id
;
3913 channel
= MPTSAS_RAID_CHANNEL
;
3918 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3920 if (sas_info
->is_cached
||
3921 sas_info
->is_hidden_raid_component
||
3922 sas_info
->is_logical_volume
)
3924 if (sas_info
->fw
.channel
== fw_channel
&&
3925 sas_info
->fw
.id
== fw_id
) {
3926 id
= sas_info
->os
.id
;
3927 channel
= sas_info
->os
.channel
;
3935 mutex_unlock(&ioc
->sas_device_info_mutex
);
3938 shost_for_each_device(sdev
, ioc
->sh
) {
3939 if (sdev
->id
== id
&& sdev
->channel
== channel
) {
3940 if (current_depth
> sdev
->queue_depth
) {
3941 sdev_printk(KERN_INFO
, sdev
,
3942 "strange observation, the queue "
3943 "depth is (%d) meanwhile fw queue "
3944 "depth (%d)\n", sdev
->queue_depth
,
3948 depth
= scsi_track_queue_full(sdev
,
3951 sdev_printk(KERN_INFO
, sdev
,
3952 "Queue depth reduced to (%d)\n",
3955 sdev_printk(KERN_INFO
, sdev
,
3956 "Tagged Command Queueing is being "
3958 else if (depth
== 0)
3959 sdev_printk(KERN_INFO
, sdev
,
3960 "Queue depth not changed yet\n");
3965 mptsas_free_fw_event(ioc
, fw_event
);
3969 static struct mptsas_phyinfo
*
3970 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER
*ioc
, u64 sas_address
)
3972 struct mptsas_portinfo
*port_info
;
3973 struct mptsas_phyinfo
*phy_info
= NULL
;
3976 mutex_lock(&ioc
->sas_topology_mutex
);
3977 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3978 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3979 if (!mptsas_is_end_device(
3980 &port_info
->phy_info
[i
].attached
))
3982 if (port_info
->phy_info
[i
].attached
.sas_address
3985 phy_info
= &port_info
->phy_info
[i
];
3989 mutex_unlock(&ioc
->sas_topology_mutex
);
3994 * mptsas_find_phyinfo_by_phys_disk_num -
3995 * @ioc: Pointer to MPT_ADAPTER structure
4001 static struct mptsas_phyinfo
*
4002 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER
*ioc
, u8 phys_disk_num
,
4005 struct mptsas_phyinfo
*phy_info
= NULL
;
4006 struct mptsas_portinfo
*port_info
;
4007 RaidPhysDiskPage1_t
*phys_disk
= NULL
;
4009 u64 sas_address
= 0;
4013 if (!ioc
->raid_data
.pIocPg3
)
4015 /* dual port support */
4016 num_paths
= mpt_raid_phys_disk_get_num_paths(ioc
, phys_disk_num
);
4019 phys_disk
= kzalloc(offsetof(RaidPhysDiskPage1_t
, Path
) +
4020 (num_paths
* sizeof(RAID_PHYS_DISK1_PATH
)), GFP_KERNEL
);
4023 mpt_raid_phys_disk_pg1(ioc
, phys_disk_num
, phys_disk
);
4024 for (i
= 0; i
< num_paths
; i
++) {
4025 if ((phys_disk
->Path
[i
].Flags
& 1) != 0)
4026 /* entry no longer valid */
4028 if ((id
== phys_disk
->Path
[i
].PhysDiskID
) &&
4029 (channel
== phys_disk
->Path
[i
].PhysDiskBus
)) {
4030 memcpy(&sas_address
, &phys_disk
->Path
[i
].WWID
,
4032 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4044 * Extra code to handle RAID0 case, where the sas_address is not updated
4045 * in phys_disk_page_1 when hotswapped
4047 mutex_lock(&ioc
->sas_topology_mutex
);
4048 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
4049 for (i
= 0; i
< port_info
->num_phys
&& !phy_info
; i
++) {
4050 if (!mptsas_is_end_device(
4051 &port_info
->phy_info
[i
].attached
))
4053 if (port_info
->phy_info
[i
].attached
.phys_disk_num
== ~0)
4055 if ((port_info
->phy_info
[i
].attached
.phys_disk_num
==
4057 (port_info
->phy_info
[i
].attached
.id
== id
) &&
4058 (port_info
->phy_info
[i
].attached
.channel
==
4060 phy_info
= &port_info
->phy_info
[i
];
4063 mutex_unlock(&ioc
->sas_topology_mutex
);
4068 mptsas_reprobe_lun(struct scsi_device
*sdev
, void *data
)
4072 sdev
->no_uld_attach
= data
? 1 : 0;
4073 rc
= scsi_device_reprobe(sdev
);
4077 mptsas_reprobe_target(struct scsi_target
*starget
, int uld_attach
)
4079 starget_for_each_device(starget
, uld_attach
? (void *)1 : NULL
,
4080 mptsas_reprobe_lun
);
4084 mptsas_adding_inactive_raid_components(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
4087 ConfigPageHeader_t hdr
;
4088 dma_addr_t dma_handle
;
4089 pRaidVolumePage0_t buffer
= NULL
;
4090 RaidPhysDiskPage0_t phys_disk
;
4092 struct mptsas_phyinfo
*phy_info
;
4093 struct mptsas_devinfo sas_device
;
4095 memset(&cfg
, 0 , sizeof(CONFIGPARMS
));
4096 memset(&hdr
, 0 , sizeof(ConfigPageHeader_t
));
4097 hdr
.PageType
= MPI_CONFIG_PAGETYPE_RAID_VOLUME
;
4098 cfg
.pageAddr
= (channel
<< 8) + id
;
4099 cfg
.cfghdr
.hdr
= &hdr
;
4100 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
4102 if (mpt_config(ioc
, &cfg
) != 0)
4105 if (!hdr
.PageLength
)
4108 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.PageLength
* 4,
4114 cfg
.physAddr
= dma_handle
;
4115 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
4117 if (mpt_config(ioc
, &cfg
) != 0)
4120 if (!(buffer
->VolumeStatus
.Flags
&
4121 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE
))
4124 if (!buffer
->NumPhysDisks
)
4127 for (i
= 0; i
< buffer
->NumPhysDisks
; i
++) {
4129 if (mpt_raid_phys_disk_pg0(ioc
,
4130 buffer
->PhysDisk
[i
].PhysDiskNum
, &phys_disk
) != 0)
4133 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4134 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4135 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4136 (phys_disk
.PhysDiskBus
<< 8) +
4137 phys_disk
.PhysDiskID
))
4140 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4141 sas_device
.sas_address
);
4142 mptsas_add_end_device(ioc
, phy_info
);
4147 pci_free_consistent(ioc
->pcidev
, hdr
.PageLength
* 4, buffer
,
4151 * Work queue thread to handle SAS hotplug events
4154 mptsas_hotplug_work(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
4155 struct mptsas_hotplug_event
*hot_plug_info
)
4157 struct mptsas_phyinfo
*phy_info
;
4158 struct scsi_target
* starget
;
4159 struct mptsas_devinfo sas_device
;
4160 VirtTarget
*vtarget
;
4163 switch (hot_plug_info
->event_type
) {
4165 case MPTSAS_ADD_PHYSDISK
:
4167 if (!ioc
->raid_data
.pIocPg2
)
4170 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
4171 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
==
4172 hot_plug_info
->id
) {
4173 printk(MYIOC_s_WARN_FMT
"firmware bug: unable "
4174 "to add hidden disk - target_id matchs "
4175 "volume_id\n", ioc
->name
);
4176 mptsas_free_fw_event(ioc
, fw_event
);
4180 mpt_findImVolumes(ioc
);
4182 case MPTSAS_ADD_DEVICE
:
4183 memset(&sas_device
, 0, sizeof(struct mptsas_devinfo
));
4184 mptsas_sas_device_pg0(ioc
, &sas_device
,
4185 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4186 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4187 (hot_plug_info
->channel
<< 8) +
4190 if (!sas_device
.handle
)
4193 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
4197 if (mptsas_get_rphy(phy_info
))
4200 mptsas_add_end_device(ioc
, phy_info
);
4203 case MPTSAS_DEL_DEVICE
:
4204 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4205 hot_plug_info
->sas_address
);
4206 mptsas_del_end_device(ioc
, phy_info
);
4209 case MPTSAS_DEL_PHYSDISK
:
4211 mpt_findImVolumes(ioc
);
4213 phy_info
= mptsas_find_phyinfo_by_phys_disk_num(
4214 ioc
, hot_plug_info
->phys_disk_num
,
4215 hot_plug_info
->channel
,
4217 mptsas_del_end_device(ioc
, phy_info
);
4220 case MPTSAS_ADD_PHYSDISK_REPROBE
:
4222 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4223 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4224 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4225 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4226 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4227 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4228 __func__
, hot_plug_info
->id
, __LINE__
));
4232 phy_info
= mptsas_find_phyinfo_by_sas_address(
4233 ioc
, sas_device
.sas_address
);
4236 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4237 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4238 __func__
, hot_plug_info
->id
, __LINE__
));
4242 starget
= mptsas_get_starget(phy_info
);
4244 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4245 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4246 __func__
, hot_plug_info
->id
, __LINE__
));
4250 vtarget
= starget
->hostdata
;
4252 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4253 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4254 __func__
, hot_plug_info
->id
, __LINE__
));
4258 mpt_findImVolumes(ioc
);
4260 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Hidding: "
4261 "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4262 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4263 hot_plug_info
->phys_disk_num
, (unsigned long long)
4264 sas_device
.sas_address
);
4266 vtarget
->id
= hot_plug_info
->phys_disk_num
;
4267 vtarget
->tflags
|= MPT_TARGET_FLAGS_RAID_COMPONENT
;
4268 phy_info
->attached
.phys_disk_num
= hot_plug_info
->phys_disk_num
;
4269 mptsas_reprobe_target(starget
, 1);
4272 case MPTSAS_DEL_PHYSDISK_REPROBE
:
4274 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4275 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4276 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4277 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4278 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4279 "%s: fw_id=%d exit at line=%d\n",
4280 ioc
->name
, __func__
,
4281 hot_plug_info
->id
, __LINE__
));
4285 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4286 sas_device
.sas_address
);
4288 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4289 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4290 __func__
, hot_plug_info
->id
, __LINE__
));
4294 starget
= mptsas_get_starget(phy_info
);
4296 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4297 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4298 __func__
, hot_plug_info
->id
, __LINE__
));
4302 vtarget
= starget
->hostdata
;
4304 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4305 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4306 __func__
, hot_plug_info
->id
, __LINE__
));
4310 if (!(vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)) {
4311 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4312 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4313 __func__
, hot_plug_info
->id
, __LINE__
));
4317 mpt_findImVolumes(ioc
);
4319 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Exposing:"
4320 " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4321 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4322 hot_plug_info
->phys_disk_num
, (unsigned long long)
4323 sas_device
.sas_address
);
4325 vtarget
->tflags
&= ~MPT_TARGET_FLAGS_RAID_COMPONENT
;
4326 vtarget
->id
= hot_plug_info
->id
;
4327 phy_info
->attached
.phys_disk_num
= ~0;
4328 mptsas_reprobe_target(starget
, 0);
4329 mptsas_add_device_component_by_fw(ioc
,
4330 hot_plug_info
->channel
, hot_plug_info
->id
);
4333 case MPTSAS_ADD_RAID
:
4335 mpt_findImVolumes(ioc
);
4336 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
4337 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4339 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4340 hot_plug_info
->id
, 0);
4343 case MPTSAS_DEL_RAID
:
4345 mpt_findImVolumes(ioc
);
4346 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4347 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4349 scsi_remove_device(hot_plug_info
->sdev
);
4350 scsi_device_put(hot_plug_info
->sdev
);
4353 case MPTSAS_ADD_INACTIVE_VOLUME
:
4355 mpt_findImVolumes(ioc
);
4356 mptsas_adding_inactive_raid_components(ioc
,
4357 hot_plug_info
->channel
, hot_plug_info
->id
);
4364 mptsas_free_fw_event(ioc
, fw_event
);
4368 mptsas_send_sas_event(struct fw_event_work
*fw_event
)
4371 struct mptsas_hotplug_event hot_plug_info
;
4372 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
;
4376 ioc
= fw_event
->ioc
;
4377 sas_event_data
= (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)
4378 fw_event
->event_data
;
4379 device_info
= le32_to_cpu(sas_event_data
->DeviceInfo
);
4382 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
4383 MPI_SAS_DEVICE_INFO_STP_TARGET
|
4384 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0) {
4385 mptsas_free_fw_event(ioc
, fw_event
);
4389 if (sas_event_data
->ReasonCode
==
4390 MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
) {
4391 mptbase_sas_persist_operation(ioc
,
4392 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4393 mptsas_free_fw_event(ioc
, fw_event
);
4397 switch (sas_event_data
->ReasonCode
) {
4398 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
:
4399 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED
:
4400 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4401 hot_plug_info
.handle
= le16_to_cpu(sas_event_data
->DevHandle
);
4402 hot_plug_info
.channel
= sas_event_data
->Bus
;
4403 hot_plug_info
.id
= sas_event_data
->TargetID
;
4404 hot_plug_info
.phy_id
= sas_event_data
->PhyNum
;
4405 memcpy(&sas_address
, &sas_event_data
->SASAddress
,
4407 hot_plug_info
.sas_address
= le64_to_cpu(sas_address
);
4408 hot_plug_info
.device_info
= device_info
;
4409 if (sas_event_data
->ReasonCode
&
4410 MPI_EVENT_SAS_DEV_STAT_RC_ADDED
)
4411 hot_plug_info
.event_type
= MPTSAS_ADD_DEVICE
;
4413 hot_plug_info
.event_type
= MPTSAS_DEL_DEVICE
;
4414 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4417 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
:
4418 mptbase_sas_persist_operation(ioc
,
4419 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4420 mptsas_free_fw_event(ioc
, fw_event
);
4423 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA
:
4425 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET
:
4428 mptsas_free_fw_event(ioc
, fw_event
);
4434 mptsas_send_raid_event(struct fw_event_work
*fw_event
)
4437 EVENT_DATA_RAID
*raid_event_data
;
4438 struct mptsas_hotplug_event hot_plug_info
;
4441 struct scsi_device
*sdev
= NULL
;
4442 VirtDevice
*vdevice
= NULL
;
4443 RaidPhysDiskPage0_t phys_disk
;
4445 ioc
= fw_event
->ioc
;
4446 raid_event_data
= (EVENT_DATA_RAID
*)fw_event
->event_data
;
4447 status
= le32_to_cpu(raid_event_data
->SettingsStatus
);
4448 state
= (status
>> 8) & 0xff;
4450 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4451 hot_plug_info
.id
= raid_event_data
->VolumeID
;
4452 hot_plug_info
.channel
= raid_event_data
->VolumeBus
;
4453 hot_plug_info
.phys_disk_num
= raid_event_data
->PhysDiskNum
;
4455 if (raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_DELETED
||
4456 raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_CREATED
||
4457 raid_event_data
->ReasonCode
==
4458 MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
) {
4459 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4460 hot_plug_info
.id
, 0);
4461 hot_plug_info
.sdev
= sdev
;
4463 vdevice
= sdev
->hostdata
;
4466 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4467 "ReasonCode=%02x\n", ioc
->name
, __func__
,
4468 raid_event_data
->ReasonCode
));
4470 switch (raid_event_data
->ReasonCode
) {
4471 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED
:
4472 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK_REPROBE
;
4474 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED
:
4475 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK_REPROBE
;
4477 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED
:
4479 case MPI_PD_STATE_ONLINE
:
4480 case MPI_PD_STATE_NOT_COMPATIBLE
:
4481 mpt_raid_phys_disk_pg0(ioc
,
4482 raid_event_data
->PhysDiskNum
, &phys_disk
);
4483 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4484 hot_plug_info
.channel
= phys_disk
.PhysDiskBus
;
4485 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4487 case MPI_PD_STATE_FAILED
:
4488 case MPI_PD_STATE_MISSING
:
4489 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST
:
4490 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST
:
4491 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON
:
4492 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4498 case MPI_EVENT_RAID_RC_VOLUME_DELETED
:
4501 vdevice
->vtarget
->deleted
= 1; /* block IO */
4502 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4504 case MPI_EVENT_RAID_RC_VOLUME_CREATED
:
4506 scsi_device_put(sdev
);
4509 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4511 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
:
4512 if (!(status
& MPI_RAIDVOL0_STATUS_FLAG_ENABLED
)) {
4515 vdevice
->vtarget
->deleted
= 1; /* block IO */
4516 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4520 case MPI_RAIDVOL0_STATUS_STATE_FAILED
:
4521 case MPI_RAIDVOL0_STATUS_STATE_MISSING
:
4524 vdevice
->vtarget
->deleted
= 1; /* block IO */
4525 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4527 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL
:
4528 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED
:
4530 scsi_device_put(sdev
);
4533 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4543 if (hot_plug_info
.event_type
!= MPTSAS_IGNORE_EVENT
)
4544 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4546 mptsas_free_fw_event(ioc
, fw_event
);
4550 * mptsas_issue_tm - send mptsas internal tm request
4551 * @ioc: Pointer to MPT_ADAPTER structure
4552 * @type: Task Management type
4553 * @channel: channel number for task management
4554 * @id: Logical Target ID for reset (if appropriate)
4555 * @lun: Logical unit for reset (if appropriate)
4556 * @task_context: Context for the task to be aborted
4557 * @timeout: timeout for task management control
4559 * return 0 on success and -1 on failure:
4563 mptsas_issue_tm(MPT_ADAPTER
*ioc
, u8 type
, u8 channel
, u8 id
, u64 lun
,
4564 int task_context
, ulong timeout
, u8
*issue_reset
)
4567 SCSITaskMgmt_t
*pScsiTm
;
4569 unsigned long timeleft
;
4572 mf
= mpt_get_msg_frame(mptsasDeviceResetCtx
, ioc
);
4574 retval
= -1; /* return failure */
4575 dtmprintk(ioc
, printk(MYIOC_s_WARN_FMT
"TaskMgmt request: no "
4576 "msg frames!!\n", ioc
->name
));
4580 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt request: mr = %p, "
4581 "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, "
4582 "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc
->name
, mf
,
4583 type
, timeout
, channel
, id
, (unsigned long long)lun
,
4586 pScsiTm
= (SCSITaskMgmt_t
*) mf
;
4587 memset(pScsiTm
, 0, sizeof(SCSITaskMgmt_t
));
4588 pScsiTm
->Function
= MPI_FUNCTION_SCSI_TASK_MGMT
;
4589 pScsiTm
->TaskType
= type
;
4590 pScsiTm
->MsgFlags
= 0;
4591 pScsiTm
->TargetID
= id
;
4592 pScsiTm
->Bus
= channel
;
4593 pScsiTm
->ChainOffset
= 0;
4594 pScsiTm
->Reserved
= 0;
4595 pScsiTm
->Reserved1
= 0;
4596 pScsiTm
->TaskMsgContext
= task_context
;
4597 int_to_scsilun(lun
, (struct scsi_lun
*)pScsiTm
->LUN
);
4599 INITIALIZE_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4600 CLEAR_MGMT_STATUS(ioc
->internal_cmds
.status
)
4602 mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx
, ioc
, mf
);
4604 /* Now wait for the command to complete */
4605 timeleft
= wait_for_completion_timeout(&ioc
->taskmgmt_cmds
.done
,
4607 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
4608 retval
= -1; /* return failure */
4609 dtmprintk(ioc
, printk(MYIOC_s_ERR_FMT
4610 "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc
->name
, mf
));
4611 mpt_free_msg_frame(ioc
, mf
);
4612 if (ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
4618 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_RF_VALID
)) {
4619 retval
= -1; /* return failure */
4620 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4621 "TaskMgmt request: failed with no reply\n", ioc
->name
));
4626 CLEAR_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4631 * mptsas_broadcast_primative_work - Handle broadcast primitives
4632 * @work: work queue payload containing info describing the event
4634 * this will be handled in workqueue context.
4637 mptsas_broadcast_primative_work(struct fw_event_work
*fw_event
)
4639 MPT_ADAPTER
*ioc
= fw_event
->ioc
;
4641 VirtDevice
*vdevice
;
4643 struct scsi_cmnd
*sc
;
4644 SCSITaskMgmtReply_t
*pScsiTmReply
;
4649 u32 termination_count
;
4652 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4653 "%s - enter\n", ioc
->name
, __func__
));
4655 mutex_lock(&ioc
->taskmgmt_cmds
.mutex
);
4656 if (mpt_set_taskmgmt_in_progress_flag(ioc
) != 0) {
4657 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4658 mptsas_requeue_fw_event(ioc
, fw_event
, 1000);
4663 termination_count
= 0;
4665 mpt_findImVolumes(ioc
);
4666 pScsiTmReply
= (SCSITaskMgmtReply_t
*) ioc
->taskmgmt_cmds
.reply
;
4668 for (ii
= 0; ii
< ioc
->req_depth
; ii
++) {
4669 if (ioc
->fw_events_off
)
4671 sc
= mptscsih_get_scsi_lookup(ioc
, ii
);
4674 mf
= MPT_INDEX_2_MFPTR(ioc
, ii
);
4677 task_context
= mf
->u
.frame
.hwhdr
.msgctxu
.MsgContext
;
4678 vdevice
= sc
->device
->hostdata
;
4679 if (!vdevice
|| !vdevice
->vtarget
)
4681 if (vdevice
->vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)
4682 continue; /* skip hidden raid components */
4683 if (vdevice
->vtarget
->raidVolume
)
4684 continue; /* skip hidden raid components */
4685 channel
= vdevice
->vtarget
->channel
;
4686 id
= vdevice
->vtarget
->id
;
4688 if (mptsas_issue_tm(ioc
, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK
,
4689 channel
, id
, (u64
)lun
, task_context
, 30, &issue_reset
))
4692 termination_count
+=
4693 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4694 if ((pScsiTmReply
->IOCStatus
== MPI_IOCSTATUS_SUCCESS
) &&
4695 (pScsiTmReply
->ResponseCode
==
4696 MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED
||
4697 pScsiTmReply
->ResponseCode
==
4698 MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC
))
4700 if (mptsas_issue_tm(ioc
,
4701 MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET
,
4702 channel
, id
, (u64
)lun
, 0, 30, &issue_reset
))
4704 termination_count
+=
4705 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4709 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4710 "%s - exit, query_count = %d termination_count = %d\n",
4711 ioc
->name
, __func__
, query_count
, termination_count
));
4713 ioc
->broadcast_aen_busy
= 0;
4714 mpt_clear_taskmgmt_in_progress_flag(ioc
);
4715 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4718 printk(MYIOC_s_WARN_FMT
"Issuing Reset from %s!!\n",
4719 ioc
->name
, __func__
);
4720 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
4722 mptsas_free_fw_event(ioc
, fw_event
);
4726 * mptsas_send_ir2_event - handle exposing hidden disk when
4727 * an inactive raid volume is added
4729 * @ioc: Pointer to MPT_ADAPTER structure
4734 mptsas_send_ir2_event(struct fw_event_work
*fw_event
)
4737 struct mptsas_hotplug_event hot_plug_info
;
4738 MPI_EVENT_DATA_IR2
*ir2_data
;
4740 RaidPhysDiskPage0_t phys_disk
;
4742 ioc
= fw_event
->ioc
;
4743 ir2_data
= (MPI_EVENT_DATA_IR2
*)fw_event
->event_data
;
4744 reasonCode
= ir2_data
->ReasonCode
;
4746 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4747 "ReasonCode=%02x\n", ioc
->name
, __func__
, reasonCode
));
4749 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4750 hot_plug_info
.id
= ir2_data
->TargetID
;
4751 hot_plug_info
.channel
= ir2_data
->Bus
;
4752 switch (reasonCode
) {
4753 case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED
:
4754 hot_plug_info
.event_type
= MPTSAS_ADD_INACTIVE_VOLUME
;
4756 case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED
:
4757 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4758 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4760 case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED
:
4761 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4762 mpt_raid_phys_disk_pg0(ioc
,
4763 ir2_data
->PhysDiskNum
, &phys_disk
);
4764 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4765 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4768 mptsas_free_fw_event(ioc
, fw_event
);
4771 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4775 mptsas_event_process(MPT_ADAPTER
*ioc
, EventNotificationReply_t
*reply
)
4777 u32 event
= le32_to_cpu(reply
->Event
);
4778 int sz
, event_data_sz
;
4779 struct fw_event_work
*fw_event
;
4780 unsigned long delay
;
4782 /* events turned off due to host reset or driver unloading */
4783 if (ioc
->fw_events_off
)
4786 delay
= msecs_to_jiffies(1);
4788 case MPI_EVENT_SAS_BROADCAST_PRIMITIVE
:
4790 EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*broadcast_event_data
=
4791 (EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*)reply
->Data
;
4792 if (broadcast_event_data
->Primitive
!=
4793 MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT
)
4795 if (ioc
->broadcast_aen_busy
)
4797 ioc
->broadcast_aen_busy
= 1;
4800 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
:
4802 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
=
4803 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)reply
->Data
;
4805 if (sas_event_data
->ReasonCode
==
4806 MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
) {
4807 mptsas_target_reset_queue(ioc
, sas_event_data
);
4812 case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE
:
4814 MpiEventDataSasExpanderStatusChange_t
*expander_data
=
4815 (MpiEventDataSasExpanderStatusChange_t
*)reply
->Data
;
4817 if (ioc
->old_sas_discovery_protocal
)
4820 if (expander_data
->ReasonCode
==
4821 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
&&
4822 ioc
->device_missing_delay
)
4823 delay
= HZ
* ioc
->device_missing_delay
;
4826 case MPI_EVENT_SAS_DISCOVERY
:
4828 u32 discovery_status
;
4829 EventDataSasDiscovery_t
*discovery_data
=
4830 (EventDataSasDiscovery_t
*)reply
->Data
;
4832 discovery_status
= le32_to_cpu(discovery_data
->DiscoveryStatus
);
4833 ioc
->sas_discovery_quiesce_io
= discovery_status
? 1 : 0;
4834 if (ioc
->old_sas_discovery_protocal
&& !discovery_status
)
4835 mptsas_queue_rescan(ioc
);
4838 case MPI_EVENT_INTEGRATED_RAID
:
4839 case MPI_EVENT_PERSISTENT_TABLE_FULL
:
4841 case MPI_EVENT_SAS_PHY_LINK_STATUS
:
4842 case MPI_EVENT_QUEUE_FULL
:
4848 event_data_sz
= ((reply
->MsgLength
* 4) -
4849 offsetof(EventNotificationReply_t
, Data
));
4850 sz
= offsetof(struct fw_event_work
, event_data
) + event_data_sz
;
4851 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
4853 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n", ioc
->name
,
4854 __func__
, __LINE__
);
4857 memcpy(fw_event
->event_data
, reply
->Data
, event_data_sz
);
4858 fw_event
->event
= event
;
4859 fw_event
->ioc
= ioc
;
4860 mptsas_add_fw_event(ioc
, fw_event
, delay
);
4864 /* Delete a volume when no longer listed in ioc pg2
4866 static void mptsas_volume_delete(MPT_ADAPTER
*ioc
, u8 id
)
4868 struct scsi_device
*sdev
;
4871 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
, id
, 0);
4874 if (!ioc
->raid_data
.pIocPg2
)
4876 if (!ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
4878 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++)
4879 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
== id
)
4882 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4883 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
, id
);
4884 scsi_remove_device(sdev
);
4886 scsi_device_put(sdev
);
4890 mptsas_probe(struct pci_dev
*pdev
, const struct pci_device_id
*id
)
4892 struct Scsi_Host
*sh
;
4895 unsigned long flags
;
4903 r
= mpt_attach(pdev
,id
);
4907 ioc
= pci_get_drvdata(pdev
);
4908 mptsas_fw_event_off(ioc
);
4909 ioc
->DoneCtx
= mptsasDoneCtx
;
4910 ioc
->TaskCtx
= mptsasTaskCtx
;
4911 ioc
->InternalCtx
= mptsasInternalCtx
;
4913 /* Added sanity check on readiness of the MPT adapter.
4915 if (ioc
->last_state
!= MPI_IOC_STATE_OPERATIONAL
) {
4916 printk(MYIOC_s_WARN_FMT
4917 "Skipping because it's not operational!\n",
4920 goto out_mptsas_probe
;
4924 printk(MYIOC_s_WARN_FMT
"Skipping because it's disabled!\n",
4927 goto out_mptsas_probe
;
4930 /* Sanity check - ensure at least 1 port is INITIATOR capable
4933 for (ii
= 0; ii
< ioc
->facts
.NumberOfPorts
; ii
++) {
4934 if (ioc
->pfacts
[ii
].ProtocolFlags
&
4935 MPI_PORTFACTS_PROTOCOL_INITIATOR
)
4940 printk(MYIOC_s_WARN_FMT
4941 "Skipping ioc=%p because SCSI Initiator mode "
4942 "is NOT enabled!\n", ioc
->name
, ioc
);
4946 sh
= scsi_host_alloc(&mptsas_driver_template
, sizeof(MPT_SCSI_HOST
));
4948 printk(MYIOC_s_WARN_FMT
4949 "Unable to register controller with SCSI subsystem\n",
4952 goto out_mptsas_probe
;
4955 spin_lock_irqsave(&ioc
->FreeQlock
, flags
);
4957 /* Attach the SCSI Host to the IOC structure
4965 /* set 16 byte cdb's */
4966 sh
->max_cmd_len
= 16;
4967 sh
->can_queue
= min_t(int, ioc
->req_depth
- 10, sh
->can_queue
);
4969 sh
->max_lun
= max_lun
;
4970 sh
->transportt
= mptsas_transport_template
;
4974 sh
->unique_id
= ioc
->id
;
4976 INIT_LIST_HEAD(&ioc
->sas_topology
);
4977 mutex_init(&ioc
->sas_topology_mutex
);
4978 mutex_init(&ioc
->sas_discovery_mutex
);
4979 mutex_init(&ioc
->sas_mgmt
.mutex
);
4980 init_completion(&ioc
->sas_mgmt
.done
);
4982 /* Verify that we won't exceed the maximum
4983 * number of chain buffers
4984 * We can optimize: ZZ = req_sz/sizeof(SGE)
4986 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
4987 * + (req_sz - 64)/sizeof(SGE)
4988 * A slightly different algorithm is required for
4991 scale
= ioc
->req_sz
/ioc
->SGE_size
;
4992 if (ioc
->sg_addr_size
== sizeof(u64
)) {
4993 numSGE
= (scale
- 1) *
4994 (ioc
->facts
.MaxChainDepth
-1) + scale
+
4995 (ioc
->req_sz
- 60) / ioc
->SGE_size
;
4997 numSGE
= 1 + (scale
- 1) *
4998 (ioc
->facts
.MaxChainDepth
-1) + scale
+
4999 (ioc
->req_sz
- 64) / ioc
->SGE_size
;
5002 if (numSGE
< sh
->sg_tablesize
) {
5003 /* Reset this value */
5004 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
5005 "Resetting sg_tablesize to %d from %d\n",
5006 ioc
->name
, numSGE
, sh
->sg_tablesize
));
5007 sh
->sg_tablesize
= numSGE
;
5010 hd
= shost_priv(sh
);
5013 /* SCSI needs scsi_cmnd lookup table!
5014 * (with size equal to req_depth*PtrSz!)
5016 ioc
->ScsiLookup
= kcalloc(ioc
->req_depth
, sizeof(void *), GFP_ATOMIC
);
5017 if (!ioc
->ScsiLookup
) {
5019 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
5020 goto out_mptsas_probe
;
5022 spin_lock_init(&ioc
->scsi_lookup_lock
);
5024 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"ScsiLookup @ %p\n",
5025 ioc
->name
, ioc
->ScsiLookup
));
5027 ioc
->sas_data
.ptClear
= mpt_pt_clear
;
5029 hd
->last_queue_full
= 0;
5030 INIT_LIST_HEAD(&hd
->target_reset_list
);
5031 INIT_LIST_HEAD(&ioc
->sas_device_info_list
);
5032 mutex_init(&ioc
->sas_device_info_mutex
);
5034 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
5036 if (ioc
->sas_data
.ptClear
==1) {
5037 mptbase_sas_persist_operation(
5038 ioc
, MPI_SAS_OP_CLEAR_ALL_PERSISTENT
);
5041 error
= scsi_add_host(sh
, &ioc
->pcidev
->dev
);
5043 dprintk(ioc
, printk(MYIOC_s_ERR_FMT
5044 "scsi_add_host failed\n", ioc
->name
));
5045 goto out_mptsas_probe
;
5048 /* older firmware doesn't support expander events */
5049 if ((ioc
->facts
.HeaderVersion
>> 8) < 0xE)
5050 ioc
->old_sas_discovery_protocal
= 1;
5051 mptsas_scan_sas_topology(ioc
);
5052 mptsas_fw_event_on(ioc
);
5057 mptscsih_remove(pdev
);
5062 mptsas_shutdown(struct pci_dev
*pdev
)
5064 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
5066 mptsas_fw_event_off(ioc
);
5067 mptsas_cleanup_fw_event_q(ioc
);
5070 static void __devexit
mptsas_remove(struct pci_dev
*pdev
)
5072 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
5073 struct mptsas_portinfo
*p
, *n
;
5076 mptsas_shutdown(pdev
);
5078 mptsas_del_device_components(ioc
);
5080 ioc
->sas_discovery_ignore_events
= 1;
5081 sas_remove_host(ioc
->sh
);
5083 mutex_lock(&ioc
->sas_topology_mutex
);
5084 list_for_each_entry_safe(p
, n
, &ioc
->sas_topology
, list
) {
5086 for (i
= 0 ; i
< p
->num_phys
; i
++)
5087 mptsas_port_delete(ioc
, p
->phy_info
[i
].port_details
);
5092 mutex_unlock(&ioc
->sas_topology_mutex
);
5093 ioc
->hba_port_info
= NULL
;
5094 mptscsih_remove(pdev
);
5097 static struct pci_device_id mptsas_pci_table
[] = {
5098 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064
,
5099 PCI_ANY_ID
, PCI_ANY_ID
},
5100 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068
,
5101 PCI_ANY_ID
, PCI_ANY_ID
},
5102 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064E
,
5103 PCI_ANY_ID
, PCI_ANY_ID
},
5104 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068E
,
5105 PCI_ANY_ID
, PCI_ANY_ID
},
5106 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1078
,
5107 PCI_ANY_ID
, PCI_ANY_ID
},
5108 {0} /* Terminating entry */
5110 MODULE_DEVICE_TABLE(pci
, mptsas_pci_table
);
5113 static struct pci_driver mptsas_driver
= {
5115 .id_table
= mptsas_pci_table
,
5116 .probe
= mptsas_probe
,
5117 .remove
= __devexit_p(mptsas_remove
),
5118 .shutdown
= mptsas_shutdown
,
5120 .suspend
= mptscsih_suspend
,
5121 .resume
= mptscsih_resume
,
5130 show_mptmod_ver(my_NAME
, my_VERSION
);
5132 mptsas_transport_template
=
5133 sas_attach_transport(&mptsas_transport_functions
);
5134 if (!mptsas_transport_template
)
5137 mptsasDoneCtx
= mpt_register(mptscsih_io_done
, MPTSAS_DRIVER
);
5138 mptsasTaskCtx
= mpt_register(mptscsih_taskmgmt_complete
, MPTSAS_DRIVER
);
5140 mpt_register(mptscsih_scandv_complete
, MPTSAS_DRIVER
);
5141 mptsasMgmtCtx
= mpt_register(mptsas_mgmt_done
, MPTSAS_DRIVER
);
5142 mptsasDeviceResetCtx
=
5143 mpt_register(mptsas_taskmgmt_complete
, MPTSAS_DRIVER
);
5145 mpt_event_register(mptsasDoneCtx
, mptsas_event_process
);
5146 mpt_reset_register(mptsasDoneCtx
, mptsas_ioc_reset
);
5148 error
= pci_register_driver(&mptsas_driver
);
5150 sas_release_transport(mptsas_transport_template
);
5158 pci_unregister_driver(&mptsas_driver
);
5159 sas_release_transport(mptsas_transport_template
);
5161 mpt_reset_deregister(mptsasDoneCtx
);
5162 mpt_event_deregister(mptsasDoneCtx
);
5164 mpt_deregister(mptsasMgmtCtx
);
5165 mpt_deregister(mptsasInternalCtx
);
5166 mpt_deregister(mptsasTaskCtx
);
5167 mpt_deregister(mptsasDoneCtx
);
5168 mpt_deregister(mptsasDeviceResetCtx
);
5171 module_init(mptsas_init
);
5172 module_exit(mptsas_exit
);