2 * linux/drivers/message/fusion/mptsas.c
3 * For use with LSI PCI chip/adapter(s)
4 * running LSI Fusion MPT (Message Passing Technology) firmware.
6 * Copyright (c) 1999-2008 LSI Corporation
7 * (mailto:DL-MPTFusionLinux@lsi.com)
9 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; version 2 of the License.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
21 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
22 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
23 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
24 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
25 solely responsible for determining the appropriateness of using and
26 distributing the Program and assumes all risks associated with its
27 exercise of rights under this Agreement, including but not limited to
28 the risks and costs of program errors, damage to or loss of data,
29 programs or equipment, and unavailability or interruption of operations.
31 DISCLAIMER OF LIABILITY
32 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
33 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
35 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
36 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
37 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
38 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40 You should have received a copy of the GNU General Public License
41 along with this program; if not, write to the Free Software
42 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
44 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
46 #include <linux/module.h>
47 #include <linux/kernel.h>
48 #include <linux/init.h>
49 #include <linux/errno.h>
50 #include <linux/jiffies.h>
51 #include <linux/workqueue.h>
52 #include <linux/delay.h> /* for mdelay */
54 #include <scsi/scsi.h>
55 #include <scsi/scsi_cmnd.h>
56 #include <scsi/scsi_device.h>
57 #include <scsi/scsi_host.h>
58 #include <scsi/scsi_transport_sas.h>
59 #include <scsi/scsi_dbg.h>
66 #define my_NAME "Fusion MPT SAS Host driver"
67 #define my_VERSION MPT_LINUX_VERSION_COMMON
68 #define MYNAM "mptsas"
71 * Reserved channel for integrated raid
73 #define MPTSAS_RAID_CHANNEL 1
75 #define SAS_CONFIG_PAGE_TIMEOUT 30
76 MODULE_AUTHOR(MODULEAUTHOR
);
77 MODULE_DESCRIPTION(my_NAME
);
78 MODULE_LICENSE("GPL");
79 MODULE_VERSION(my_VERSION
);
81 static int mpt_pt_clear
;
82 module_param(mpt_pt_clear
, int, 0);
83 MODULE_PARM_DESC(mpt_pt_clear
,
84 " Clear persistency table: enable=1 "
85 "(default=MPTSCSIH_PT_CLEAR=0)");
87 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
88 #define MPTSAS_MAX_LUN (16895)
89 static int max_lun
= MPTSAS_MAX_LUN
;
90 module_param(max_lun
, int, 0);
91 MODULE_PARM_DESC(max_lun
, " max lun, default=16895 ");
93 static u8 mptsasDoneCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
94 static u8 mptsasTaskCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
95 static u8 mptsasInternalCtx
= MPT_MAX_PROTOCOL_DRIVERS
; /* Used only for internal commands */
96 static u8 mptsasMgmtCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
97 static u8 mptsasDeviceResetCtx
= MPT_MAX_PROTOCOL_DRIVERS
;
99 static void mptsas_firmware_event_work(struct work_struct
*work
);
100 static void mptsas_send_sas_event(struct fw_event_work
*fw_event
);
101 static void mptsas_send_raid_event(struct fw_event_work
*fw_event
);
102 static void mptsas_send_ir2_event(struct fw_event_work
*fw_event
);
103 static void mptsas_parse_device_info(struct sas_identify
*identify
,
104 struct mptsas_devinfo
*device_info
);
105 static inline void mptsas_set_rphy(MPT_ADAPTER
*ioc
,
106 struct mptsas_phyinfo
*phy_info
, struct sas_rphy
*rphy
);
107 static struct mptsas_phyinfo
*mptsas_find_phyinfo_by_sas_address
108 (MPT_ADAPTER
*ioc
, u64 sas_address
);
109 static int mptsas_sas_device_pg0(MPT_ADAPTER
*ioc
,
110 struct mptsas_devinfo
*device_info
, u32 form
, u32 form_specific
);
111 static int mptsas_sas_enclosure_pg0(MPT_ADAPTER
*ioc
,
112 struct mptsas_enclosure
*enclosure
, u32 form
, u32 form_specific
);
113 static int mptsas_add_end_device(MPT_ADAPTER
*ioc
,
114 struct mptsas_phyinfo
*phy_info
);
115 static void mptsas_del_end_device(MPT_ADAPTER
*ioc
,
116 struct mptsas_phyinfo
*phy_info
);
117 static void mptsas_send_link_status_event(struct fw_event_work
*fw_event
);
118 static struct mptsas_portinfo
*mptsas_find_portinfo_by_sas_address
119 (MPT_ADAPTER
*ioc
, u64 sas_address
);
120 static void mptsas_expander_delete(MPT_ADAPTER
*ioc
,
121 struct mptsas_portinfo
*port_info
, u8 force
);
122 static void mptsas_send_expander_event(struct fw_event_work
*fw_event
);
123 static void mptsas_not_responding_devices(MPT_ADAPTER
*ioc
);
124 static void mptsas_scan_sas_topology(MPT_ADAPTER
*ioc
);
125 static void mptsas_broadcast_primative_work(struct fw_event_work
*fw_event
);
126 static void mptsas_handle_queue_full_event(struct fw_event_work
*fw_event
);
127 static void mptsas_volume_delete(MPT_ADAPTER
*ioc
, u8 id
);
129 static void mptsas_print_phy_data(MPT_ADAPTER
*ioc
,
130 MPI_SAS_IO_UNIT0_PHY_DATA
*phy_data
)
132 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
133 "---- IO UNIT PAGE 0 ------------\n", ioc
->name
));
134 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Handle=0x%X\n",
135 ioc
->name
, le16_to_cpu(phy_data
->AttachedDeviceHandle
)));
136 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Controller Handle=0x%X\n",
137 ioc
->name
, le16_to_cpu(phy_data
->ControllerDevHandle
)));
138 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Port=0x%X\n",
139 ioc
->name
, phy_data
->Port
));
140 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Port Flags=0x%X\n",
141 ioc
->name
, phy_data
->PortFlags
));
142 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Flags=0x%X\n",
143 ioc
->name
, phy_data
->PhyFlags
));
144 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Negotiated Link Rate=0x%X\n",
145 ioc
->name
, phy_data
->NegotiatedLinkRate
));
146 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
147 "Controller PHY Device Info=0x%X\n", ioc
->name
,
148 le32_to_cpu(phy_data
->ControllerPhyDeviceInfo
)));
149 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"DiscoveryStatus=0x%X\n\n",
150 ioc
->name
, le32_to_cpu(phy_data
->DiscoveryStatus
)));
153 static void mptsas_print_phy_pg0(MPT_ADAPTER
*ioc
, SasPhyPage0_t
*pg0
)
157 memcpy(&sas_address
, &pg0
->SASAddress
, sizeof(__le64
));
159 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
160 "---- SAS PHY PAGE 0 ------------\n", ioc
->name
));
161 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
162 "Attached Device Handle=0x%X\n", ioc
->name
,
163 le16_to_cpu(pg0
->AttachedDevHandle
)));
164 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"SAS Address=0x%llX\n",
165 ioc
->name
, (unsigned long long)le64_to_cpu(sas_address
)));
166 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
167 "Attached PHY Identifier=0x%X\n", ioc
->name
,
168 pg0
->AttachedPhyIdentifier
));
169 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Attached Device Info=0x%X\n",
170 ioc
->name
, le32_to_cpu(pg0
->AttachedDeviceInfo
)));
171 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Programmed Link Rate=0x%X\n",
172 ioc
->name
, pg0
->ProgrammedLinkRate
));
173 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Change Count=0x%X\n",
174 ioc
->name
, pg0
->ChangeCount
));
175 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Info=0x%X\n\n",
176 ioc
->name
, le32_to_cpu(pg0
->PhyInfo
)));
179 static void mptsas_print_phy_pg1(MPT_ADAPTER
*ioc
, SasPhyPage1_t
*pg1
)
181 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
182 "---- SAS PHY PAGE 1 ------------\n", ioc
->name
));
183 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Invalid Dword Count=0x%x\n",
184 ioc
->name
, pg1
->InvalidDwordCount
));
185 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
186 "Running Disparity Error Count=0x%x\n", ioc
->name
,
187 pg1
->RunningDisparityErrorCount
));
188 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
189 "Loss Dword Synch Count=0x%x\n", ioc
->name
,
190 pg1
->LossDwordSynchCount
));
191 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
192 "PHY Reset Problem Count=0x%x\n\n", ioc
->name
,
193 pg1
->PhyResetProblemCount
));
196 static void mptsas_print_device_pg0(MPT_ADAPTER
*ioc
, SasDevicePage0_t
*pg0
)
200 memcpy(&sas_address
, &pg0
->SASAddress
, sizeof(__le64
));
202 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
203 "---- SAS DEVICE PAGE 0 ---------\n", ioc
->name
));
204 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Handle=0x%X\n",
205 ioc
->name
, le16_to_cpu(pg0
->DevHandle
)));
206 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Parent Handle=0x%X\n",
207 ioc
->name
, le16_to_cpu(pg0
->ParentDevHandle
)));
208 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Enclosure Handle=0x%X\n",
209 ioc
->name
, le16_to_cpu(pg0
->EnclosureHandle
)));
210 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Slot=0x%X\n",
211 ioc
->name
, le16_to_cpu(pg0
->Slot
)));
212 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"SAS Address=0x%llX\n",
213 ioc
->name
, (unsigned long long)le64_to_cpu(sas_address
)));
214 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Target ID=0x%X\n",
215 ioc
->name
, pg0
->TargetID
));
216 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Bus=0x%X\n",
217 ioc
->name
, pg0
->Bus
));
218 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Parent Phy Num=0x%X\n",
219 ioc
->name
, pg0
->PhyNum
));
220 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Access Status=0x%X\n",
221 ioc
->name
, le16_to_cpu(pg0
->AccessStatus
)));
222 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Device Info=0x%X\n",
223 ioc
->name
, le32_to_cpu(pg0
->DeviceInfo
)));
224 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Flags=0x%X\n",
225 ioc
->name
, le16_to_cpu(pg0
->Flags
)));
226 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Physical Port=0x%X\n\n",
227 ioc
->name
, pg0
->PhysicalPort
));
230 static void mptsas_print_expander_pg1(MPT_ADAPTER
*ioc
, SasExpanderPage1_t
*pg1
)
232 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
233 "---- SAS EXPANDER PAGE 1 ------------\n", ioc
->name
));
234 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Physical Port=0x%X\n",
235 ioc
->name
, pg1
->PhysicalPort
));
236 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"PHY Identifier=0x%X\n",
237 ioc
->name
, pg1
->PhyIdentifier
));
238 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Negotiated Link Rate=0x%X\n",
239 ioc
->name
, pg1
->NegotiatedLinkRate
));
240 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Programmed Link Rate=0x%X\n",
241 ioc
->name
, pg1
->ProgrammedLinkRate
));
242 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Hardware Link Rate=0x%X\n",
243 ioc
->name
, pg1
->HwLinkRate
));
244 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Owner Device Handle=0x%X\n",
245 ioc
->name
, le16_to_cpu(pg1
->OwnerDevHandle
)));
246 dsasprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
247 "Attached Device Handle=0x%X\n\n", ioc
->name
,
248 le16_to_cpu(pg1
->AttachedDevHandle
)));
251 /* inhibit sas firmware event handling */
253 mptsas_fw_event_off(MPT_ADAPTER
*ioc
)
257 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
258 ioc
->fw_events_off
= 1;
259 ioc
->sas_discovery_quiesce_io
= 0;
260 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
264 /* enable sas firmware event handling */
266 mptsas_fw_event_on(MPT_ADAPTER
*ioc
)
270 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
271 ioc
->fw_events_off
= 0;
272 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
275 /* queue a sas firmware event */
277 mptsas_add_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
282 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
283 list_add_tail(&fw_event
->list
, &ioc
->fw_event_list
);
284 INIT_DELAYED_WORK(&fw_event
->work
, mptsas_firmware_event_work
);
285 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: add (fw_event=0x%p)\n",
286 ioc
->name
, __func__
, fw_event
));
287 queue_delayed_work(ioc
->fw_event_q
, &fw_event
->work
,
289 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
292 /* requeue a sas firmware event */
294 mptsas_requeue_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
298 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
299 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: reschedule task "
300 "(fw_event=0x%p)\n", ioc
->name
, __func__
, fw_event
));
302 queue_delayed_work(ioc
->fw_event_q
, &fw_event
->work
,
303 msecs_to_jiffies(delay
));
304 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
307 /* free memory assoicated to a sas firmware event */
309 mptsas_free_fw_event(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
)
313 spin_lock_irqsave(&ioc
->fw_event_lock
, flags
);
314 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: kfree (fw_event=0x%p)\n",
315 ioc
->name
, __func__
, fw_event
));
316 list_del(&fw_event
->list
);
318 spin_unlock_irqrestore(&ioc
->fw_event_lock
, flags
);
321 /* walk the firmware event queue, and either stop or wait for
322 * outstanding events to complete */
324 mptsas_cleanup_fw_event_q(MPT_ADAPTER
*ioc
)
326 struct fw_event_work
*fw_event
, *next
;
327 struct mptsas_target_reset_event
*target_reset_list
, *n
;
328 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
330 /* flush the target_reset_list */
331 if (!list_empty(&hd
->target_reset_list
)) {
332 list_for_each_entry_safe(target_reset_list
, n
,
333 &hd
->target_reset_list
, list
) {
334 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
335 "%s: removing target reset for id=%d\n",
337 target_reset_list
->sas_event_data
.TargetID
));
338 list_del(&target_reset_list
->list
);
339 kfree(target_reset_list
);
343 if (list_empty(&ioc
->fw_event_list
) ||
344 !ioc
->fw_event_q
|| in_interrupt())
347 list_for_each_entry_safe(fw_event
, next
, &ioc
->fw_event_list
, list
) {
348 if (cancel_delayed_work(&fw_event
->work
))
349 mptsas_free_fw_event(ioc
, fw_event
);
354 static inline MPT_ADAPTER
*phy_to_ioc(struct sas_phy
*phy
)
356 struct Scsi_Host
*shost
= dev_to_shost(phy
->dev
.parent
);
357 return ((MPT_SCSI_HOST
*)shost
->hostdata
)->ioc
;
360 static inline MPT_ADAPTER
*rphy_to_ioc(struct sas_rphy
*rphy
)
362 struct Scsi_Host
*shost
= dev_to_shost(rphy
->dev
.parent
->parent
);
363 return ((MPT_SCSI_HOST
*)shost
->hostdata
)->ioc
;
367 * mptsas_find_portinfo_by_handle
369 * This function should be called with the sas_topology_mutex already held
371 static struct mptsas_portinfo
*
372 mptsas_find_portinfo_by_handle(MPT_ADAPTER
*ioc
, u16 handle
)
374 struct mptsas_portinfo
*port_info
, *rc
=NULL
;
377 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
)
378 for (i
= 0; i
< port_info
->num_phys
; i
++)
379 if (port_info
->phy_info
[i
].identify
.handle
== handle
) {
388 * mptsas_find_portinfo_by_sas_address -
389 * @ioc: Pointer to MPT_ADAPTER structure
392 * This function should be called with the sas_topology_mutex already held
395 static struct mptsas_portinfo
*
396 mptsas_find_portinfo_by_sas_address(MPT_ADAPTER
*ioc
, u64 sas_address
)
398 struct mptsas_portinfo
*port_info
, *rc
= NULL
;
401 if (sas_address
>= ioc
->hba_port_sas_addr
&&
402 sas_address
< (ioc
->hba_port_sas_addr
+
403 ioc
->hba_port_num_phy
))
404 return ioc
->hba_port_info
;
406 mutex_lock(&ioc
->sas_topology_mutex
);
407 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
)
408 for (i
= 0; i
< port_info
->num_phys
; i
++)
409 if (port_info
->phy_info
[i
].identify
.sas_address
==
415 mutex_unlock(&ioc
->sas_topology_mutex
);
420 * Returns true if there is a scsi end device
423 mptsas_is_end_device(struct mptsas_devinfo
* attached
)
425 if ((attached
->sas_address
) &&
426 (attached
->device_info
&
427 MPI_SAS_DEVICE_INFO_END_DEVICE
) &&
428 ((attached
->device_info
&
429 MPI_SAS_DEVICE_INFO_SSP_TARGET
) |
430 (attached
->device_info
&
431 MPI_SAS_DEVICE_INFO_STP_TARGET
) |
432 (attached
->device_info
&
433 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)))
441 mptsas_port_delete(MPT_ADAPTER
*ioc
, struct mptsas_portinfo_details
* port_details
)
443 struct mptsas_portinfo
*port_info
;
444 struct mptsas_phyinfo
*phy_info
;
450 port_info
= port_details
->port_info
;
451 phy_info
= port_info
->phy_info
;
453 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: [%p]: num_phys=%02d "
454 "bitmask=0x%016llX\n", ioc
->name
, __func__
, port_details
,
455 port_details
->num_phys
, (unsigned long long)
456 port_details
->phy_bitmask
));
458 for (i
= 0; i
< port_info
->num_phys
; i
++, phy_info
++) {
459 if(phy_info
->port_details
!= port_details
)
461 memset(&phy_info
->attached
, 0, sizeof(struct mptsas_devinfo
));
462 mptsas_set_rphy(ioc
, phy_info
, NULL
);
463 phy_info
->port_details
= NULL
;
468 static inline struct sas_rphy
*
469 mptsas_get_rphy(struct mptsas_phyinfo
*phy_info
)
471 if (phy_info
->port_details
)
472 return phy_info
->port_details
->rphy
;
478 mptsas_set_rphy(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
, struct sas_rphy
*rphy
)
480 if (phy_info
->port_details
) {
481 phy_info
->port_details
->rphy
= rphy
;
482 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"sas_rphy_add: rphy=%p\n",
487 dsaswideprintk(ioc
, dev_printk(KERN_DEBUG
,
488 &rphy
->dev
, MYIOC_s_FMT
"add:", ioc
->name
));
489 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"rphy=%p release=%p\n",
490 ioc
->name
, rphy
, rphy
->dev
.release
));
494 static inline struct sas_port
*
495 mptsas_get_port(struct mptsas_phyinfo
*phy_info
)
497 if (phy_info
->port_details
)
498 return phy_info
->port_details
->port
;
504 mptsas_set_port(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
, struct sas_port
*port
)
506 if (phy_info
->port_details
)
507 phy_info
->port_details
->port
= port
;
510 dsaswideprintk(ioc
, dev_printk(KERN_DEBUG
,
511 &port
->dev
, MYIOC_s_FMT
"add:", ioc
->name
));
512 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"port=%p release=%p\n",
513 ioc
->name
, port
, port
->dev
.release
));
517 static inline struct scsi_target
*
518 mptsas_get_starget(struct mptsas_phyinfo
*phy_info
)
520 if (phy_info
->port_details
)
521 return phy_info
->port_details
->starget
;
527 mptsas_set_starget(struct mptsas_phyinfo
*phy_info
, struct scsi_target
*
530 if (phy_info
->port_details
)
531 phy_info
->port_details
->starget
= starget
;
535 * mptsas_add_device_component -
536 * @ioc: Pointer to MPT_ADAPTER structure
537 * @channel: fw mapped id's
544 mptsas_add_device_component(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
,
545 u64 sas_address
, u32 device_info
, u16 slot
, u64 enclosure_logical_id
)
547 struct mptsas_device_info
*sas_info
, *next
;
548 struct scsi_device
*sdev
;
549 struct scsi_target
*starget
;
550 struct sas_rphy
*rphy
;
553 * Delete all matching devices out of the list
555 mutex_lock(&ioc
->sas_device_info_mutex
);
556 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
558 if (!sas_info
->is_logical_volume
&&
559 (sas_info
->sas_address
== sas_address
||
560 (sas_info
->fw
.channel
== channel
&&
561 sas_info
->fw
.id
== id
))) {
562 list_del(&sas_info
->list
);
567 sas_info
= kzalloc(sizeof(struct mptsas_device_info
), GFP_KERNEL
);
572 * Set Firmware mapping
574 sas_info
->fw
.id
= id
;
575 sas_info
->fw
.channel
= channel
;
577 sas_info
->sas_address
= sas_address
;
578 sas_info
->device_info
= device_info
;
579 sas_info
->slot
= slot
;
580 sas_info
->enclosure_logical_id
= enclosure_logical_id
;
581 INIT_LIST_HEAD(&sas_info
->list
);
582 list_add_tail(&sas_info
->list
, &ioc
->sas_device_info_list
);
587 shost_for_each_device(sdev
, ioc
->sh
) {
588 starget
= scsi_target(sdev
);
589 rphy
= dev_to_rphy(starget
->dev
.parent
);
590 if (rphy
->identify
.sas_address
== sas_address
) {
591 sas_info
->os
.id
= starget
->id
;
592 sas_info
->os
.channel
= starget
->channel
;
597 mutex_unlock(&ioc
->sas_device_info_mutex
);
602 * mptsas_add_device_component_by_fw -
603 * @ioc: Pointer to MPT_ADAPTER structure
604 * @channel: fw mapped id's
609 mptsas_add_device_component_by_fw(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
611 struct mptsas_devinfo sas_device
;
612 struct mptsas_enclosure enclosure_info
;
615 rc
= mptsas_sas_device_pg0(ioc
, &sas_device
,
616 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
617 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
618 (channel
<< 8) + id
);
622 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
623 mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
624 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
625 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
),
626 sas_device
.handle_enclosure
);
628 mptsas_add_device_component(ioc
, sas_device
.channel
,
629 sas_device
.id
, sas_device
.sas_address
, sas_device
.device_info
,
630 sas_device
.slot
, enclosure_info
.enclosure_logical_id
);
634 * mptsas_add_device_component_starget_ir - Handle Integrated RAID, adding each individual device to list
635 * @ioc: Pointer to MPT_ADAPTER structure
636 * @channel: fw mapped id's
641 mptsas_add_device_component_starget_ir(MPT_ADAPTER
*ioc
,
642 struct scsi_target
*starget
)
645 ConfigPageHeader_t hdr
;
646 dma_addr_t dma_handle
;
647 pRaidVolumePage0_t buffer
= NULL
;
649 RaidPhysDiskPage0_t phys_disk
;
650 struct mptsas_device_info
*sas_info
, *next
;
652 memset(&cfg
, 0 , sizeof(CONFIGPARMS
));
653 memset(&hdr
, 0 , sizeof(ConfigPageHeader_t
));
654 hdr
.PageType
= MPI_CONFIG_PAGETYPE_RAID_VOLUME
;
655 /* assumption that all volumes on channel = 0 */
656 cfg
.pageAddr
= starget
->id
;
657 cfg
.cfghdr
.hdr
= &hdr
;
658 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
659 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
661 if (mpt_config(ioc
, &cfg
) != 0)
667 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.PageLength
* 4,
673 cfg
.physAddr
= dma_handle
;
674 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
676 if (mpt_config(ioc
, &cfg
) != 0)
679 if (!buffer
->NumPhysDisks
)
683 * Adding entry for hidden components
685 for (i
= 0; i
< buffer
->NumPhysDisks
; i
++) {
687 if (mpt_raid_phys_disk_pg0(ioc
,
688 buffer
->PhysDisk
[i
].PhysDiskNum
, &phys_disk
) != 0)
691 mptsas_add_device_component_by_fw(ioc
, phys_disk
.PhysDiskBus
,
692 phys_disk
.PhysDiskID
);
694 mutex_lock(&ioc
->sas_device_info_mutex
);
695 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
697 if (!sas_info
->is_logical_volume
&&
698 (sas_info
->fw
.channel
== phys_disk
.PhysDiskBus
&&
699 sas_info
->fw
.id
== phys_disk
.PhysDiskID
)) {
700 sas_info
->is_hidden_raid_component
= 1;
701 sas_info
->volume_id
= starget
->id
;
704 mutex_unlock(&ioc
->sas_device_info_mutex
);
709 * Delete all matching devices out of the list
711 mutex_lock(&ioc
->sas_device_info_mutex
);
712 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
714 if (sas_info
->is_logical_volume
&& sas_info
->fw
.id
==
716 list_del(&sas_info
->list
);
721 sas_info
= kzalloc(sizeof(struct mptsas_device_info
), GFP_KERNEL
);
723 sas_info
->fw
.id
= starget
->id
;
724 sas_info
->os
.id
= starget
->id
;
725 sas_info
->os
.channel
= starget
->channel
;
726 sas_info
->is_logical_volume
= 1;
727 INIT_LIST_HEAD(&sas_info
->list
);
728 list_add_tail(&sas_info
->list
, &ioc
->sas_device_info_list
);
730 mutex_unlock(&ioc
->sas_device_info_mutex
);
734 pci_free_consistent(ioc
->pcidev
, hdr
.PageLength
* 4, buffer
,
739 * mptsas_add_device_component_starget -
740 * @ioc: Pointer to MPT_ADAPTER structure
745 mptsas_add_device_component_starget(MPT_ADAPTER
*ioc
,
746 struct scsi_target
*starget
)
749 struct sas_rphy
*rphy
;
750 struct mptsas_phyinfo
*phy_info
= NULL
;
751 struct mptsas_enclosure enclosure_info
;
753 rphy
= dev_to_rphy(starget
->dev
.parent
);
754 vtarget
= starget
->hostdata
;
755 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
756 rphy
->identify
.sas_address
);
760 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
761 mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
762 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
763 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
),
764 phy_info
->attached
.handle_enclosure
);
766 mptsas_add_device_component(ioc
, phy_info
->attached
.channel
,
767 phy_info
->attached
.id
, phy_info
->attached
.sas_address
,
768 phy_info
->attached
.device_info
,
769 phy_info
->attached
.slot
, enclosure_info
.enclosure_logical_id
);
773 * mptsas_del_device_component_by_os - Once a device has been removed, we mark the entry in the list as being cached
774 * @ioc: Pointer to MPT_ADAPTER structure
775 * @channel: os mapped id's
780 mptsas_del_device_component_by_os(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
782 struct mptsas_device_info
*sas_info
, *next
;
787 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
789 if (sas_info
->os
.channel
== channel
&& sas_info
->os
.id
== id
)
790 sas_info
->is_cached
= 1;
795 * mptsas_del_device_components - Cleaning the list
796 * @ioc: Pointer to MPT_ADAPTER structure
800 mptsas_del_device_components(MPT_ADAPTER
*ioc
)
802 struct mptsas_device_info
*sas_info
, *next
;
804 mutex_lock(&ioc
->sas_device_info_mutex
);
805 list_for_each_entry_safe(sas_info
, next
, &ioc
->sas_device_info_list
,
807 list_del(&sas_info
->list
);
810 mutex_unlock(&ioc
->sas_device_info_mutex
);
815 * mptsas_setup_wide_ports
817 * Updates for new and existing narrow/wide port configuration
818 * in the sas_topology
821 mptsas_setup_wide_ports(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
823 struct mptsas_portinfo_details
* port_details
;
824 struct mptsas_phyinfo
*phy_info
, *phy_info_cmp
;
828 mutex_lock(&ioc
->sas_topology_mutex
);
830 phy_info
= port_info
->phy_info
;
831 for (i
= 0 ; i
< port_info
->num_phys
; i
++, phy_info
++) {
832 if (phy_info
->attached
.handle
)
834 port_details
= phy_info
->port_details
;
837 if (port_details
->num_phys
< 2)
840 * Removing a phy from a port, letting the last
841 * phy be removed by firmware events.
843 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
844 "%s: [%p]: deleting phy = %d\n",
845 ioc
->name
, __func__
, port_details
, i
));
846 port_details
->num_phys
--;
847 port_details
->phy_bitmask
&= ~ (1 << phy_info
->phy_id
);
848 memset(&phy_info
->attached
, 0, sizeof(struct mptsas_devinfo
));
850 devtprintk(ioc
, dev_printk(KERN_DEBUG
,
851 &phy_info
->phy
->dev
, MYIOC_s_FMT
852 "delete phy %d, phy-obj (0x%p)\n", ioc
->name
,
853 phy_info
->phy_id
, phy_info
->phy
));
854 sas_port_delete_phy(port_details
->port
, phy_info
->phy
);
856 phy_info
->port_details
= NULL
;
860 * Populate and refresh the tree
862 phy_info
= port_info
->phy_info
;
863 for (i
= 0 ; i
< port_info
->num_phys
; i
++, phy_info
++) {
864 sas_address
= phy_info
->attached
.sas_address
;
865 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"phy_id=%d sas_address=0x%018llX\n",
866 ioc
->name
, i
, (unsigned long long)sas_address
));
869 port_details
= phy_info
->port_details
;
874 port_details
= kzalloc(sizeof(struct
875 mptsas_portinfo_details
), GFP_KERNEL
);
878 port_details
->num_phys
= 1;
879 port_details
->port_info
= port_info
;
880 if (phy_info
->phy_id
< 64 )
881 port_details
->phy_bitmask
|=
882 (1 << phy_info
->phy_id
);
883 phy_info
->sas_port_add_phy
=1;
884 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"\t\tForming port\n\t\t"
885 "phy_id=%d sas_address=0x%018llX\n",
886 ioc
->name
, i
, (unsigned long long)sas_address
));
887 phy_info
->port_details
= port_details
;
890 if (i
== port_info
->num_phys
- 1)
892 phy_info_cmp
= &port_info
->phy_info
[i
+ 1];
893 for (j
= i
+ 1 ; j
< port_info
->num_phys
; j
++,
895 if (!phy_info_cmp
->attached
.sas_address
)
897 if (sas_address
!= phy_info_cmp
->attached
.sas_address
)
899 if (phy_info_cmp
->port_details
== port_details
)
901 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
902 "\t\tphy_id=%d sas_address=0x%018llX\n",
903 ioc
->name
, j
, (unsigned long long)
904 phy_info_cmp
->attached
.sas_address
));
905 if (phy_info_cmp
->port_details
) {
907 mptsas_get_rphy(phy_info_cmp
);
909 mptsas_get_port(phy_info_cmp
);
910 port_details
->starget
=
911 mptsas_get_starget(phy_info_cmp
);
912 port_details
->num_phys
=
913 phy_info_cmp
->port_details
->num_phys
;
914 if (!phy_info_cmp
->port_details
->num_phys
)
915 kfree(phy_info_cmp
->port_details
);
917 phy_info_cmp
->sas_port_add_phy
=1;
919 * Adding a phy to a port
921 phy_info_cmp
->port_details
= port_details
;
922 if (phy_info_cmp
->phy_id
< 64 )
923 port_details
->phy_bitmask
|=
924 (1 << phy_info_cmp
->phy_id
);
925 port_details
->num_phys
++;
931 for (i
= 0; i
< port_info
->num_phys
; i
++) {
932 port_details
= port_info
->phy_info
[i
].port_details
;
935 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
936 "%s: [%p]: phy_id=%02d num_phys=%02d "
937 "bitmask=0x%016llX\n", ioc
->name
, __func__
,
938 port_details
, i
, port_details
->num_phys
,
939 (unsigned long long)port_details
->phy_bitmask
));
940 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"\t\tport = %p rphy=%p\n",
941 ioc
->name
, port_details
->port
, port_details
->rphy
));
943 dsaswideprintk(ioc
, printk("\n"));
944 mutex_unlock(&ioc
->sas_topology_mutex
);
948 * csmisas_find_vtarget
956 mptsas_find_vtarget(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
958 struct scsi_device
*sdev
;
960 VirtTarget
*vtarget
= NULL
;
962 shost_for_each_device(sdev
, ioc
->sh
) {
963 vdevice
= sdev
->hostdata
;
964 if ((vdevice
== NULL
) ||
965 (vdevice
->vtarget
== NULL
))
967 if ((vdevice
->vtarget
->tflags
&
968 MPT_TARGET_FLAGS_RAID_COMPONENT
||
969 vdevice
->vtarget
->raidVolume
))
971 if (vdevice
->vtarget
->id
== id
&&
972 vdevice
->vtarget
->channel
== channel
)
973 vtarget
= vdevice
->vtarget
;
979 mptsas_queue_device_delete(MPT_ADAPTER
*ioc
,
980 MpiEventDataSasDeviceStatusChange_t
*sas_event_data
)
982 struct fw_event_work
*fw_event
;
985 sz
= offsetof(struct fw_event_work
, event_data
) +
986 sizeof(MpiEventDataSasDeviceStatusChange_t
);
987 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
989 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n",
990 ioc
->name
, __func__
, __LINE__
);
993 memcpy(fw_event
->event_data
, sas_event_data
,
994 sizeof(MpiEventDataSasDeviceStatusChange_t
));
995 fw_event
->event
= MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
;
997 mptsas_add_fw_event(ioc
, fw_event
, msecs_to_jiffies(1));
1001 mptsas_queue_rescan(MPT_ADAPTER
*ioc
)
1003 struct fw_event_work
*fw_event
;
1006 sz
= offsetof(struct fw_event_work
, event_data
);
1007 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
1009 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n",
1010 ioc
->name
, __func__
, __LINE__
);
1013 fw_event
->event
= -1;
1014 fw_event
->ioc
= ioc
;
1015 mptsas_add_fw_event(ioc
, fw_event
, msecs_to_jiffies(1));
1020 * mptsas_target_reset
1022 * Issues TARGET_RESET to end device using handshaking method
1028 * Returns (1) success
1033 mptsas_target_reset(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
1036 SCSITaskMgmt_t
*pScsiTm
;
1037 if (mpt_set_taskmgmt_in_progress_flag(ioc
) != 0)
1041 mf
= mpt_get_msg_frame(mptsasDeviceResetCtx
, ioc
);
1043 dfailprintk(ioc
, printk(MYIOC_s_WARN_FMT
1044 "%s, no msg frames @%d!!\n", ioc
->name
,
1045 __func__
, __LINE__
));
1049 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt request (mf=%p)\n",
1052 /* Format the Request
1054 pScsiTm
= (SCSITaskMgmt_t
*) mf
;
1055 memset (pScsiTm
, 0, sizeof(SCSITaskMgmt_t
));
1056 pScsiTm
->TargetID
= id
;
1057 pScsiTm
->Bus
= channel
;
1058 pScsiTm
->Function
= MPI_FUNCTION_SCSI_TASK_MGMT
;
1059 pScsiTm
->TaskType
= MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET
;
1060 pScsiTm
->MsgFlags
= MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION
;
1062 DBG_DUMP_TM_REQUEST_FRAME(ioc
, (u32
*)mf
);
1064 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1065 "TaskMgmt type=%d (sas device delete) fw_channel = %d fw_id = %d)\n",
1066 ioc
->name
, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET
, channel
, id
));
1068 mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx
, ioc
, mf
);
1074 mpt_clear_taskmgmt_in_progress_flag(ioc
);
1079 * mptsas_target_reset_queue
1081 * Receive request for TARGET_RESET after recieving an firmware
1082 * event NOT_RESPONDING_EVENT, then put command in link list
1083 * and queue if task_queue already in use.
1090 mptsas_target_reset_queue(MPT_ADAPTER
*ioc
,
1091 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
)
1093 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
1094 VirtTarget
*vtarget
= NULL
;
1095 struct mptsas_target_reset_event
*target_reset_list
;
1098 id
= sas_event_data
->TargetID
;
1099 channel
= sas_event_data
->Bus
;
1101 if (!(vtarget
= mptsas_find_vtarget(ioc
, channel
, id
)))
1104 vtarget
->deleted
= 1; /* block IO */
1106 target_reset_list
= kzalloc(sizeof(struct mptsas_target_reset_event
),
1108 if (!target_reset_list
) {
1109 dfailprintk(ioc
, printk(MYIOC_s_WARN_FMT
1110 "%s, failed to allocate mem @%d..!!\n",
1111 ioc
->name
, __func__
, __LINE__
));
1115 memcpy(&target_reset_list
->sas_event_data
, sas_event_data
,
1116 sizeof(*sas_event_data
));
1117 list_add_tail(&target_reset_list
->list
, &hd
->target_reset_list
);
1119 target_reset_list
->time_count
= jiffies
;
1121 if (mptsas_target_reset(ioc
, channel
, id
)) {
1122 target_reset_list
->target_reset_issued
= 1;
1127 * mptsas_taskmgmt_complete - complete SAS task management function
1128 * @ioc: Pointer to MPT_ADAPTER structure
1130 * Completion for TARGET_RESET after NOT_RESPONDING_EVENT, enable work
1131 * queue to finish off removing device from upper layers. then send next
1132 * TARGET_RESET in the queue.
1135 mptsas_taskmgmt_complete(MPT_ADAPTER
*ioc
, MPT_FRAME_HDR
*mf
, MPT_FRAME_HDR
*mr
)
1137 MPT_SCSI_HOST
*hd
= shost_priv(ioc
->sh
);
1138 struct list_head
*head
= &hd
->target_reset_list
;
1140 struct mptsas_target_reset_event
*target_reset_list
;
1141 SCSITaskMgmtReply_t
*pScsiTmReply
;
1143 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt completed: "
1144 "(mf = %p, mr = %p)\n", ioc
->name
, mf
, mr
));
1146 pScsiTmReply
= (SCSITaskMgmtReply_t
*)mr
;
1148 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1149 "\tTaskMgmt completed: fw_channel = %d, fw_id = %d,\n"
1150 "\ttask_type = 0x%02X, iocstatus = 0x%04X "
1151 "loginfo = 0x%08X,\n\tresponse_code = 0x%02X, "
1152 "term_cmnds = %d\n", ioc
->name
,
1153 pScsiTmReply
->Bus
, pScsiTmReply
->TargetID
,
1154 pScsiTmReply
->TaskType
,
1155 le16_to_cpu(pScsiTmReply
->IOCStatus
),
1156 le32_to_cpu(pScsiTmReply
->IOCLogInfo
),
1157 pScsiTmReply
->ResponseCode
,
1158 le32_to_cpu(pScsiTmReply
->TerminationCount
)));
1160 if (pScsiTmReply
->ResponseCode
)
1161 mptscsih_taskmgmt_response_code(ioc
,
1162 pScsiTmReply
->ResponseCode
);
1165 if (pScsiTmReply
&& (pScsiTmReply
->TaskType
==
1166 MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK
|| pScsiTmReply
->TaskType
==
1167 MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET
)) {
1168 ioc
->taskmgmt_cmds
.status
|= MPT_MGMT_STATUS_COMMAND_GOOD
;
1169 ioc
->taskmgmt_cmds
.status
|= MPT_MGMT_STATUS_RF_VALID
;
1170 memcpy(ioc
->taskmgmt_cmds
.reply
, mr
,
1171 min(MPT_DEFAULT_FRAME_SIZE
, 4 * mr
->u
.reply
.MsgLength
));
1172 if (ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_PENDING
) {
1173 ioc
->taskmgmt_cmds
.status
&= ~MPT_MGMT_STATUS_PENDING
;
1174 complete(&ioc
->taskmgmt_cmds
.done
);
1180 mpt_clear_taskmgmt_in_progress_flag(ioc
);
1182 if (list_empty(head
))
1185 target_reset_list
= list_entry(head
->next
,
1186 struct mptsas_target_reset_event
, list
);
1188 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1189 "TaskMgmt: completed (%d seconds)\n",
1190 ioc
->name
, jiffies_to_msecs(jiffies
-
1191 target_reset_list
->time_count
)/1000));
1193 id
= pScsiTmReply
->TargetID
;
1194 channel
= pScsiTmReply
->Bus
;
1195 target_reset_list
->time_count
= jiffies
;
1198 * retry target reset
1200 if (!target_reset_list
->target_reset_issued
) {
1201 if (mptsas_target_reset(ioc
, channel
, id
))
1202 target_reset_list
->target_reset_issued
= 1;
1207 * enable work queue to remove device from upper layers
1209 list_del(&target_reset_list
->list
);
1210 if ((mptsas_find_vtarget(ioc
, channel
, id
)) && !ioc
->fw_events_off
)
1211 mptsas_queue_device_delete(ioc
,
1212 &target_reset_list
->sas_event_data
);
1216 * issue target reset to next device in the queue
1219 head
= &hd
->target_reset_list
;
1220 if (list_empty(head
))
1223 target_reset_list
= list_entry(head
->next
, struct mptsas_target_reset_event
,
1226 id
= target_reset_list
->sas_event_data
.TargetID
;
1227 channel
= target_reset_list
->sas_event_data
.Bus
;
1228 target_reset_list
->time_count
= jiffies
;
1230 if (mptsas_target_reset(ioc
, channel
, id
))
1231 target_reset_list
->target_reset_issued
= 1;
1237 * mptscsih_ioc_reset
1244 mptsas_ioc_reset(MPT_ADAPTER
*ioc
, int reset_phase
)
1249 rc
= mptscsih_ioc_reset(ioc
, reset_phase
);
1250 if ((ioc
->bus_type
!= SAS
) || (!rc
))
1253 hd
= shost_priv(ioc
->sh
);
1257 switch (reset_phase
) {
1258 case MPT_IOC_SETUP_RESET
:
1259 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1260 "%s: MPT_IOC_SETUP_RESET\n", ioc
->name
, __func__
));
1261 mptsas_fw_event_off(ioc
);
1263 case MPT_IOC_PRE_RESET
:
1264 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1265 "%s: MPT_IOC_PRE_RESET\n", ioc
->name
, __func__
));
1267 case MPT_IOC_POST_RESET
:
1268 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1269 "%s: MPT_IOC_POST_RESET\n", ioc
->name
, __func__
));
1270 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_PENDING
) {
1271 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_DID_IOCRESET
;
1272 complete(&ioc
->sas_mgmt
.done
);
1274 mptsas_cleanup_fw_event_q(ioc
);
1275 mptsas_queue_rescan(ioc
);
1287 * enum device_state -
1288 * @DEVICE_RETRY: need to retry the TUR
1289 * @DEVICE_ERROR: TUR return error, don't add device
1290 * @DEVICE_READY: device can be added
1300 mptsas_sas_enclosure_pg0(MPT_ADAPTER
*ioc
, struct mptsas_enclosure
*enclosure
,
1301 u32 form
, u32 form_specific
)
1303 ConfigExtendedPageHeader_t hdr
;
1305 SasEnclosurePage0_t
*buffer
;
1306 dma_addr_t dma_handle
;
1308 __le64 le_identifier
;
1310 memset(&hdr
, 0, sizeof(hdr
));
1311 hdr
.PageVersion
= MPI_SASENCLOSURE0_PAGEVERSION
;
1313 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
1314 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_ENCLOSURE
;
1316 cfg
.cfghdr
.ehdr
= &hdr
;
1318 cfg
.pageAddr
= form
+ form_specific
;
1319 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
1320 cfg
.dir
= 0; /* read */
1321 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
1323 error
= mpt_config(ioc
, &cfg
);
1326 if (!hdr
.ExtPageLength
) {
1331 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1338 cfg
.physAddr
= dma_handle
;
1339 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
1341 error
= mpt_config(ioc
, &cfg
);
1343 goto out_free_consistent
;
1345 /* save config data */
1346 memcpy(&le_identifier
, &buffer
->EnclosureLogicalID
, sizeof(__le64
));
1347 enclosure
->enclosure_logical_id
= le64_to_cpu(le_identifier
);
1348 enclosure
->enclosure_handle
= le16_to_cpu(buffer
->EnclosureHandle
);
1349 enclosure
->flags
= le16_to_cpu(buffer
->Flags
);
1350 enclosure
->num_slot
= le16_to_cpu(buffer
->NumSlots
);
1351 enclosure
->start_slot
= le16_to_cpu(buffer
->StartSlot
);
1352 enclosure
->start_id
= buffer
->StartTargetID
;
1353 enclosure
->start_channel
= buffer
->StartBus
;
1354 enclosure
->sep_id
= buffer
->SEPTargetID
;
1355 enclosure
->sep_channel
= buffer
->SEPBus
;
1357 out_free_consistent
:
1358 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1359 buffer
, dma_handle
);
1365 * mptsas_add_end_device - report a new end device to sas transport layer
1366 * @ioc: Pointer to MPT_ADAPTER structure
1367 * @phy_info: decribes attached device
1369 * return (0) success (1) failure
1373 mptsas_add_end_device(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
)
1375 struct sas_rphy
*rphy
;
1376 struct sas_port
*port
;
1377 struct sas_identify identify
;
1382 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1383 "%s: exit at line=%d\n", ioc
->name
,
1384 __func__
, __LINE__
));
1388 fw_id
= phy_info
->attached
.id
;
1390 if (mptsas_get_rphy(phy_info
)) {
1391 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1392 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1393 __func__
, fw_id
, __LINE__
));
1397 port
= mptsas_get_port(phy_info
);
1399 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1400 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1401 __func__
, fw_id
, __LINE__
));
1405 if (phy_info
->attached
.device_info
&
1406 MPI_SAS_DEVICE_INFO_SSP_TARGET
)
1408 if (phy_info
->attached
.device_info
&
1409 MPI_SAS_DEVICE_INFO_STP_TARGET
)
1411 if (phy_info
->attached
.device_info
&
1412 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
1415 printk(MYIOC_s_INFO_FMT
"attaching %s device: fw_channel %d, fw_id %d,"
1416 " phy %d, sas_addr 0x%llx\n", ioc
->name
, ds
,
1417 phy_info
->attached
.channel
, phy_info
->attached
.id
,
1418 phy_info
->attached
.phy_id
, (unsigned long long)
1419 phy_info
->attached
.sas_address
);
1421 mptsas_parse_device_info(&identify
, &phy_info
->attached
);
1422 rphy
= sas_end_device_alloc(port
);
1424 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1425 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1426 __func__
, fw_id
, __LINE__
));
1427 return 5; /* non-fatal: an rphy can be added later */
1430 rphy
->identify
= identify
;
1431 if (sas_rphy_add(rphy
)) {
1432 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1433 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1434 __func__
, fw_id
, __LINE__
));
1435 sas_rphy_free(rphy
);
1438 mptsas_set_rphy(ioc
, phy_info
, rphy
);
1443 * mptsas_del_end_device - report a deleted end device to sas transport layer
1444 * @ioc: Pointer to MPT_ADAPTER structure
1445 * @phy_info: decribes attached device
1449 mptsas_del_end_device(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
)
1451 struct sas_rphy
*rphy
;
1452 struct sas_port
*port
;
1453 struct mptsas_portinfo
*port_info
;
1454 struct mptsas_phyinfo
*phy_info_parent
;
1463 fw_id
= phy_info
->attached
.id
;
1464 sas_address
= phy_info
->attached
.sas_address
;
1466 if (!phy_info
->port_details
) {
1467 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1468 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1469 __func__
, fw_id
, __LINE__
));
1472 rphy
= mptsas_get_rphy(phy_info
);
1474 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1475 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1476 __func__
, fw_id
, __LINE__
));
1480 if (phy_info
->attached
.device_info
& MPI_SAS_DEVICE_INFO_SSP_INITIATOR
1481 || phy_info
->attached
.device_info
1482 & MPI_SAS_DEVICE_INFO_SMP_INITIATOR
1483 || phy_info
->attached
.device_info
1484 & MPI_SAS_DEVICE_INFO_STP_INITIATOR
)
1486 if (phy_info
->attached
.device_info
&
1487 MPI_SAS_DEVICE_INFO_SSP_TARGET
)
1489 if (phy_info
->attached
.device_info
&
1490 MPI_SAS_DEVICE_INFO_STP_TARGET
)
1492 if (phy_info
->attached
.device_info
&
1493 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
1496 dev_printk(KERN_DEBUG
, &rphy
->dev
, MYIOC_s_FMT
1497 "removing %s device: fw_channel %d, fw_id %d, phy %d,"
1498 "sas_addr 0x%llx\n", ioc
->name
, ds
, phy_info
->attached
.channel
,
1499 phy_info
->attached
.id
, phy_info
->attached
.phy_id
,
1500 (unsigned long long) sas_address
);
1502 port
= mptsas_get_port(phy_info
);
1504 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
1505 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
1506 __func__
, fw_id
, __LINE__
));
1509 port_info
= phy_info
->portinfo
;
1510 phy_info_parent
= port_info
->phy_info
;
1511 for (i
= 0; i
< port_info
->num_phys
; i
++, phy_info_parent
++) {
1512 if (!phy_info_parent
->phy
)
1514 if (phy_info_parent
->attached
.sas_address
!=
1517 dev_printk(KERN_DEBUG
, &phy_info_parent
->phy
->dev
,
1518 MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n",
1519 ioc
->name
, phy_info_parent
->phy_id
,
1520 phy_info_parent
->phy
);
1521 sas_port_delete_phy(port
, phy_info_parent
->phy
);
1524 dev_printk(KERN_DEBUG
, &port
->dev
, MYIOC_s_FMT
1525 "delete port %d, sas_addr (0x%llx)\n", ioc
->name
,
1526 port
->port_identifier
, (unsigned long long)sas_address
);
1527 sas_port_delete(port
);
1528 mptsas_set_port(ioc
, phy_info
, NULL
);
1529 mptsas_port_delete(ioc
, phy_info
->port_details
);
1532 struct mptsas_phyinfo
*
1533 mptsas_refreshing_device_handles(MPT_ADAPTER
*ioc
,
1534 struct mptsas_devinfo
*sas_device
)
1536 struct mptsas_phyinfo
*phy_info
;
1537 struct mptsas_portinfo
*port_info
;
1540 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
1541 sas_device
->sas_address
);
1544 port_info
= phy_info
->portinfo
;
1547 mutex_lock(&ioc
->sas_topology_mutex
);
1548 for (i
= 0; i
< port_info
->num_phys
; i
++) {
1549 if (port_info
->phy_info
[i
].attached
.sas_address
!=
1550 sas_device
->sas_address
)
1552 port_info
->phy_info
[i
].attached
.channel
= sas_device
->channel
;
1553 port_info
->phy_info
[i
].attached
.id
= sas_device
->id
;
1554 port_info
->phy_info
[i
].attached
.sas_address
=
1555 sas_device
->sas_address
;
1556 port_info
->phy_info
[i
].attached
.handle
= sas_device
->handle
;
1557 port_info
->phy_info
[i
].attached
.handle_parent
=
1558 sas_device
->handle_parent
;
1559 port_info
->phy_info
[i
].attached
.handle_enclosure
=
1560 sas_device
->handle_enclosure
;
1562 mutex_unlock(&ioc
->sas_topology_mutex
);
1568 * mptsas_firmware_event_work - work thread for processing fw events
1569 * @work: work queue payload containing info describing the event
1574 mptsas_firmware_event_work(struct work_struct
*work
)
1576 struct fw_event_work
*fw_event
=
1577 container_of(work
, struct fw_event_work
, work
.work
);
1578 MPT_ADAPTER
*ioc
= fw_event
->ioc
;
1580 /* special rescan topology handling */
1581 if (fw_event
->event
== -1) {
1582 if (ioc
->in_rescan
) {
1583 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
1584 "%s: rescan ignored as it is in progress\n",
1585 ioc
->name
, __func__
));
1588 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: rescan after "
1589 "reset\n", ioc
->name
, __func__
));
1591 mptsas_not_responding_devices(ioc
);
1592 mptsas_scan_sas_topology(ioc
);
1594 mptsas_free_fw_event(ioc
, fw_event
);
1595 mptsas_fw_event_on(ioc
);
1599 /* events handling turned off during host reset */
1600 if (ioc
->fw_events_off
) {
1601 mptsas_free_fw_event(ioc
, fw_event
);
1605 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"%s: fw_event=(0x%p), "
1606 "event = (0x%02x)\n", ioc
->name
, __func__
, fw_event
,
1607 (fw_event
->event
& 0xFF)));
1609 switch (fw_event
->event
) {
1610 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
:
1611 mptsas_send_sas_event(fw_event
);
1613 case MPI_EVENT_INTEGRATED_RAID
:
1614 mptsas_send_raid_event(fw_event
);
1617 mptsas_send_ir2_event(fw_event
);
1619 case MPI_EVENT_PERSISTENT_TABLE_FULL
:
1620 mptbase_sas_persist_operation(ioc
,
1621 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
1622 mptsas_free_fw_event(ioc
, fw_event
);
1624 case MPI_EVENT_SAS_BROADCAST_PRIMITIVE
:
1625 mptsas_broadcast_primative_work(fw_event
);
1627 case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE
:
1628 mptsas_send_expander_event(fw_event
);
1630 case MPI_EVENT_SAS_PHY_LINK_STATUS
:
1631 mptsas_send_link_status_event(fw_event
);
1633 case MPI_EVENT_QUEUE_FULL
:
1634 mptsas_handle_queue_full_event(fw_event
);
1642 mptsas_slave_configure(struct scsi_device
*sdev
)
1644 struct Scsi_Host
*host
= sdev
->host
;
1645 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1646 MPT_ADAPTER
*ioc
= hd
->ioc
;
1647 VirtDevice
*vdevice
= sdev
->hostdata
;
1649 if (vdevice
->vtarget
->deleted
) {
1650 sdev_printk(KERN_INFO
, sdev
, "clearing deleted flag\n");
1651 vdevice
->vtarget
->deleted
= 0;
1655 * RAID volumes placed beyond the last expected port.
1656 * Ignore sending sas mode pages in that case..
1658 if (sdev
->channel
== MPTSAS_RAID_CHANNEL
) {
1659 mptsas_add_device_component_starget_ir(ioc
, scsi_target(sdev
));
1663 sas_read_port_mode_page(sdev
);
1665 mptsas_add_device_component_starget(ioc
, scsi_target(sdev
));
1668 return mptscsih_slave_configure(sdev
);
1672 mptsas_target_alloc(struct scsi_target
*starget
)
1674 struct Scsi_Host
*host
= dev_to_shost(&starget
->dev
);
1675 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1676 VirtTarget
*vtarget
;
1678 struct sas_rphy
*rphy
;
1679 struct mptsas_portinfo
*p
;
1681 MPT_ADAPTER
*ioc
= hd
->ioc
;
1683 vtarget
= kzalloc(sizeof(VirtTarget
), GFP_KERNEL
);
1687 vtarget
->starget
= starget
;
1688 vtarget
->ioc_id
= ioc
->id
;
1689 vtarget
->tflags
= MPT_TARGET_FLAGS_Q_YES
;
1694 * RAID volumes placed beyond the last expected port.
1696 if (starget
->channel
== MPTSAS_RAID_CHANNEL
) {
1697 if (!ioc
->raid_data
.pIocPg2
) {
1701 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
1702 if (id
== ioc
->raid_data
.pIocPg2
->
1703 RaidVolume
[i
].VolumeID
) {
1704 channel
= ioc
->raid_data
.pIocPg2
->
1705 RaidVolume
[i
].VolumeBus
;
1708 vtarget
->raidVolume
= 1;
1712 rphy
= dev_to_rphy(starget
->dev
.parent
);
1713 mutex_lock(&ioc
->sas_topology_mutex
);
1714 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1715 for (i
= 0; i
< p
->num_phys
; i
++) {
1716 if (p
->phy_info
[i
].attached
.sas_address
!=
1717 rphy
->identify
.sas_address
)
1719 id
= p
->phy_info
[i
].attached
.id
;
1720 channel
= p
->phy_info
[i
].attached
.channel
;
1721 mptsas_set_starget(&p
->phy_info
[i
], starget
);
1724 * Exposing hidden raid components
1726 if (mptscsih_is_phys_disk(ioc
, channel
, id
)) {
1727 id
= mptscsih_raid_id_to_num(ioc
,
1730 MPT_TARGET_FLAGS_RAID_COMPONENT
;
1731 p
->phy_info
[i
].attached
.phys_disk_num
= id
;
1733 mutex_unlock(&ioc
->sas_topology_mutex
);
1737 mutex_unlock(&ioc
->sas_topology_mutex
);
1744 vtarget
->channel
= channel
;
1745 starget
->hostdata
= vtarget
;
1750 mptsas_target_destroy(struct scsi_target
*starget
)
1752 struct Scsi_Host
*host
= dev_to_shost(&starget
->dev
);
1753 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1754 struct sas_rphy
*rphy
;
1755 struct mptsas_portinfo
*p
;
1757 MPT_ADAPTER
*ioc
= hd
->ioc
;
1758 VirtTarget
*vtarget
;
1760 if (!starget
->hostdata
)
1763 vtarget
= starget
->hostdata
;
1765 mptsas_del_device_component_by_os(ioc
, starget
->channel
,
1769 if (starget
->channel
== MPTSAS_RAID_CHANNEL
)
1772 rphy
= dev_to_rphy(starget
->dev
.parent
);
1773 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1774 for (i
= 0; i
< p
->num_phys
; i
++) {
1775 if (p
->phy_info
[i
].attached
.sas_address
!=
1776 rphy
->identify
.sas_address
)
1779 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
1780 "delete device: fw_channel %d, fw_id %d, phy %d, "
1781 "sas_addr 0x%llx\n", ioc
->name
,
1782 p
->phy_info
[i
].attached
.channel
,
1783 p
->phy_info
[i
].attached
.id
,
1784 p
->phy_info
[i
].attached
.phy_id
, (unsigned long long)
1785 p
->phy_info
[i
].attached
.sas_address
);
1787 mptsas_set_starget(&p
->phy_info
[i
], NULL
);
1792 vtarget
->starget
= NULL
;
1793 kfree(starget
->hostdata
);
1794 starget
->hostdata
= NULL
;
1799 mptsas_slave_alloc(struct scsi_device
*sdev
)
1801 struct Scsi_Host
*host
= sdev
->host
;
1802 MPT_SCSI_HOST
*hd
= shost_priv(host
);
1803 struct sas_rphy
*rphy
;
1804 struct mptsas_portinfo
*p
;
1805 VirtDevice
*vdevice
;
1806 struct scsi_target
*starget
;
1808 MPT_ADAPTER
*ioc
= hd
->ioc
;
1810 vdevice
= kzalloc(sizeof(VirtDevice
), GFP_KERNEL
);
1812 printk(MYIOC_s_ERR_FMT
"slave_alloc kzalloc(%zd) FAILED!\n",
1813 ioc
->name
, sizeof(VirtDevice
));
1816 starget
= scsi_target(sdev
);
1817 vdevice
->vtarget
= starget
->hostdata
;
1819 if (sdev
->channel
== MPTSAS_RAID_CHANNEL
)
1822 rphy
= dev_to_rphy(sdev
->sdev_target
->dev
.parent
);
1823 mutex_lock(&ioc
->sas_topology_mutex
);
1824 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
1825 for (i
= 0; i
< p
->num_phys
; i
++) {
1826 if (p
->phy_info
[i
].attached
.sas_address
!=
1827 rphy
->identify
.sas_address
)
1829 vdevice
->lun
= sdev
->lun
;
1831 * Exposing hidden raid components
1833 if (mptscsih_is_phys_disk(ioc
,
1834 p
->phy_info
[i
].attached
.channel
,
1835 p
->phy_info
[i
].attached
.id
))
1836 sdev
->no_uld_attach
= 1;
1837 mutex_unlock(&ioc
->sas_topology_mutex
);
1841 mutex_unlock(&ioc
->sas_topology_mutex
);
1847 vdevice
->vtarget
->num_luns
++;
1848 sdev
->hostdata
= vdevice
;
1853 mptsas_qcmd(struct scsi_cmnd
*SCpnt
, void (*done
)(struct scsi_cmnd
*))
1857 VirtDevice
*vdevice
= SCpnt
->device
->hostdata
;
1859 if (!vdevice
|| !vdevice
->vtarget
|| vdevice
->vtarget
->deleted
) {
1860 SCpnt
->result
= DID_NO_CONNECT
<< 16;
1865 hd
= shost_priv(SCpnt
->device
->host
);
1868 if (ioc
->sas_discovery_quiesce_io
)
1869 return SCSI_MLQUEUE_HOST_BUSY
;
1871 // scsi_print_command(SCpnt);
1873 return mptscsih_qcmd(SCpnt
,done
);
1877 static struct scsi_host_template mptsas_driver_template
= {
1878 .module
= THIS_MODULE
,
1879 .proc_name
= "mptsas",
1880 .proc_info
= mptscsih_proc_info
,
1881 .name
= "MPT SPI Host",
1882 .info
= mptscsih_info
,
1883 .queuecommand
= mptsas_qcmd
,
1884 .target_alloc
= mptsas_target_alloc
,
1885 .slave_alloc
= mptsas_slave_alloc
,
1886 .slave_configure
= mptsas_slave_configure
,
1887 .target_destroy
= mptsas_target_destroy
,
1888 .slave_destroy
= mptscsih_slave_destroy
,
1889 .change_queue_depth
= mptscsih_change_queue_depth
,
1890 .eh_abort_handler
= mptscsih_abort
,
1891 .eh_device_reset_handler
= mptscsih_dev_reset
,
1892 .eh_bus_reset_handler
= mptscsih_bus_reset
,
1893 .eh_host_reset_handler
= mptscsih_host_reset
,
1894 .bios_param
= mptscsih_bios_param
,
1895 .can_queue
= MPT_SAS_CAN_QUEUE
,
1897 .sg_tablesize
= MPT_SCSI_SG_DEPTH
,
1898 .max_sectors
= 8192,
1900 .use_clustering
= ENABLE_CLUSTERING
,
1901 .shost_attrs
= mptscsih_host_attrs
,
1904 static int mptsas_get_linkerrors(struct sas_phy
*phy
)
1906 MPT_ADAPTER
*ioc
= phy_to_ioc(phy
);
1907 ConfigExtendedPageHeader_t hdr
;
1909 SasPhyPage1_t
*buffer
;
1910 dma_addr_t dma_handle
;
1913 /* FIXME: only have link errors on local phys */
1914 if (!scsi_is_sas_phy_local(phy
))
1917 hdr
.PageVersion
= MPI_SASPHY1_PAGEVERSION
;
1918 hdr
.ExtPageLength
= 0;
1919 hdr
.PageNumber
= 1 /* page number 1*/;
1922 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
1923 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_PHY
;
1925 cfg
.cfghdr
.ehdr
= &hdr
;
1927 cfg
.pageAddr
= phy
->identify
.phy_identifier
;
1928 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
1929 cfg
.dir
= 0; /* read */
1930 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
1932 error
= mpt_config(ioc
, &cfg
);
1935 if (!hdr
.ExtPageLength
)
1938 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1943 cfg
.physAddr
= dma_handle
;
1944 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
1946 error
= mpt_config(ioc
, &cfg
);
1948 goto out_free_consistent
;
1950 mptsas_print_phy_pg1(ioc
, buffer
);
1952 phy
->invalid_dword_count
= le32_to_cpu(buffer
->InvalidDwordCount
);
1953 phy
->running_disparity_error_count
=
1954 le32_to_cpu(buffer
->RunningDisparityErrorCount
);
1955 phy
->loss_of_dword_sync_count
=
1956 le32_to_cpu(buffer
->LossDwordSynchCount
);
1957 phy
->phy_reset_problem_count
=
1958 le32_to_cpu(buffer
->PhyResetProblemCount
);
1960 out_free_consistent
:
1961 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
1962 buffer
, dma_handle
);
1966 static int mptsas_mgmt_done(MPT_ADAPTER
*ioc
, MPT_FRAME_HDR
*req
,
1967 MPT_FRAME_HDR
*reply
)
1969 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_COMMAND_GOOD
;
1970 if (reply
!= NULL
) {
1971 ioc
->sas_mgmt
.status
|= MPT_MGMT_STATUS_RF_VALID
;
1972 memcpy(ioc
->sas_mgmt
.reply
, reply
,
1973 min(ioc
->reply_sz
, 4 * reply
->u
.reply
.MsgLength
));
1976 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_PENDING
) {
1977 ioc
->sas_mgmt
.status
&= ~MPT_MGMT_STATUS_PENDING
;
1978 complete(&ioc
->sas_mgmt
.done
);
1984 static int mptsas_phy_reset(struct sas_phy
*phy
, int hard_reset
)
1986 MPT_ADAPTER
*ioc
= phy_to_ioc(phy
);
1987 SasIoUnitControlRequest_t
*req
;
1988 SasIoUnitControlReply_t
*reply
;
1991 unsigned long timeleft
;
1992 int error
= -ERESTARTSYS
;
1994 /* FIXME: fusion doesn't allow non-local phy reset */
1995 if (!scsi_is_sas_phy_local(phy
))
1998 /* not implemented for expanders */
1999 if (phy
->identify
.target_port_protocols
& SAS_PROTOCOL_SMP
)
2002 if (mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
))
2005 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2011 hdr
= (MPIHeader_t
*) mf
;
2012 req
= (SasIoUnitControlRequest_t
*)mf
;
2013 memset(req
, 0, sizeof(SasIoUnitControlRequest_t
));
2014 req
->Function
= MPI_FUNCTION_SAS_IO_UNIT_CONTROL
;
2015 req
->MsgContext
= hdr
->MsgContext
;
2016 req
->Operation
= hard_reset
?
2017 MPI_SAS_OP_PHY_HARD_RESET
: MPI_SAS_OP_PHY_LINK_RESET
;
2018 req
->PhyNum
= phy
->identify
.phy_identifier
;
2020 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2021 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2023 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
,
2026 /* On timeout reset the board */
2027 mpt_free_msg_frame(ioc
, mf
);
2028 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
2033 /* a reply frame is expected */
2034 if ((ioc
->sas_mgmt
.status
&
2035 MPT_MGMT_STATUS_RF_VALID
) == 0) {
2040 /* process the completed Reply Message Frame */
2041 reply
= (SasIoUnitControlReply_t
*)ioc
->sas_mgmt
.reply
;
2042 if (reply
->IOCStatus
!= MPI_IOCSTATUS_SUCCESS
) {
2043 printk(MYIOC_s_INFO_FMT
"%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
2044 ioc
->name
, __func__
, reply
->IOCStatus
, reply
->IOCLogInfo
);
2052 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2053 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2059 mptsas_get_enclosure_identifier(struct sas_rphy
*rphy
, u64
*identifier
)
2061 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2063 struct mptsas_portinfo
*p
;
2064 struct mptsas_enclosure enclosure_info
;
2065 u64 enclosure_handle
;
2067 mutex_lock(&ioc
->sas_topology_mutex
);
2068 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2069 for (i
= 0; i
< p
->num_phys
; i
++) {
2070 if (p
->phy_info
[i
].attached
.sas_address
==
2071 rphy
->identify
.sas_address
) {
2072 enclosure_handle
= p
->phy_info
[i
].
2073 attached
.handle_enclosure
;
2078 mutex_unlock(&ioc
->sas_topology_mutex
);
2082 mutex_unlock(&ioc
->sas_topology_mutex
);
2083 memset(&enclosure_info
, 0, sizeof(struct mptsas_enclosure
));
2084 error
= mptsas_sas_enclosure_pg0(ioc
, &enclosure_info
,
2085 (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE
<<
2086 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT
), enclosure_handle
);
2088 *identifier
= enclosure_info
.enclosure_logical_id
;
2093 mptsas_get_bay_identifier(struct sas_rphy
*rphy
)
2095 MPT_ADAPTER
*ioc
= rphy_to_ioc(rphy
);
2096 struct mptsas_portinfo
*p
;
2099 mutex_lock(&ioc
->sas_topology_mutex
);
2100 list_for_each_entry(p
, &ioc
->sas_topology
, list
) {
2101 for (i
= 0; i
< p
->num_phys
; i
++) {
2102 if (p
->phy_info
[i
].attached
.sas_address
==
2103 rphy
->identify
.sas_address
) {
2104 rc
= p
->phy_info
[i
].attached
.slot
;
2111 mutex_unlock(&ioc
->sas_topology_mutex
);
2115 static int mptsas_smp_handler(struct Scsi_Host
*shost
, struct sas_rphy
*rphy
,
2116 struct request
*req
)
2118 MPT_ADAPTER
*ioc
= ((MPT_SCSI_HOST
*) shost
->hostdata
)->ioc
;
2120 SmpPassthroughRequest_t
*smpreq
;
2121 struct request
*rsp
= req
->next_rq
;
2124 unsigned long timeleft
;
2126 dma_addr_t dma_addr_in
= 0;
2127 dma_addr_t dma_addr_out
= 0;
2128 u64 sas_address
= 0;
2131 printk(MYIOC_s_ERR_FMT
"%s: the smp response space is missing\n",
2132 ioc
->name
, __func__
);
2136 /* do we need to support multiple segments? */
2137 if (req
->bio
->bi_vcnt
> 1 || rsp
->bio
->bi_vcnt
> 1) {
2138 printk(MYIOC_s_ERR_FMT
"%s: multiple segments req %u %u, rsp %u %u\n",
2139 ioc
->name
, __func__
, req
->bio
->bi_vcnt
, blk_rq_bytes(req
),
2140 rsp
->bio
->bi_vcnt
, blk_rq_bytes(rsp
));
2144 ret
= mutex_lock_interruptible(&ioc
->sas_mgmt
.mutex
);
2148 mf
= mpt_get_msg_frame(mptsasMgmtCtx
, ioc
);
2154 smpreq
= (SmpPassthroughRequest_t
*)mf
;
2155 memset(smpreq
, 0, sizeof(*smpreq
));
2157 smpreq
->RequestDataLength
= cpu_to_le16(blk_rq_bytes(req
) - 4);
2158 smpreq
->Function
= MPI_FUNCTION_SMP_PASSTHROUGH
;
2161 sas_address
= rphy
->identify
.sas_address
;
2163 struct mptsas_portinfo
*port_info
;
2165 mutex_lock(&ioc
->sas_topology_mutex
);
2166 port_info
= ioc
->hba_port_info
;
2167 if (port_info
&& port_info
->phy_info
)
2169 port_info
->phy_info
[0].phy
->identify
.sas_address
;
2170 mutex_unlock(&ioc
->sas_topology_mutex
);
2173 *((u64
*)&smpreq
->SASAddress
) = cpu_to_le64(sas_address
);
2176 (((int *) mf
) + (offsetof(SmpPassthroughRequest_t
, SGL
) / 4));
2179 flagsLength
= (MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2180 MPI_SGE_FLAGS_END_OF_BUFFER
|
2181 MPI_SGE_FLAGS_DIRECTION
)
2182 << MPI_SGE_FLAGS_SHIFT
;
2183 flagsLength
|= (blk_rq_bytes(req
) - 4);
2185 dma_addr_out
= pci_map_single(ioc
->pcidev
, bio_data(req
->bio
),
2186 blk_rq_bytes(req
), PCI_DMA_BIDIRECTIONAL
);
2189 ioc
->add_sge(psge
, flagsLength
, dma_addr_out
);
2190 psge
+= ioc
->SGE_size
;
2193 flagsLength
= MPI_SGE_FLAGS_SIMPLE_ELEMENT
|
2194 MPI_SGE_FLAGS_SYSTEM_ADDRESS
|
2195 MPI_SGE_FLAGS_IOC_TO_HOST
|
2196 MPI_SGE_FLAGS_END_OF_BUFFER
;
2198 flagsLength
= flagsLength
<< MPI_SGE_FLAGS_SHIFT
;
2199 flagsLength
|= blk_rq_bytes(rsp
) + 4;
2200 dma_addr_in
= pci_map_single(ioc
->pcidev
, bio_data(rsp
->bio
),
2201 blk_rq_bytes(rsp
), PCI_DMA_BIDIRECTIONAL
);
2204 ioc
->add_sge(psge
, flagsLength
, dma_addr_in
);
2206 INITIALIZE_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2207 mpt_put_msg_frame(mptsasMgmtCtx
, ioc
, mf
);
2209 timeleft
= wait_for_completion_timeout(&ioc
->sas_mgmt
.done
, 10 * HZ
);
2211 printk(MYIOC_s_ERR_FMT
"%s: smp timeout!\n", ioc
->name
, __func__
);
2212 /* On timeout reset the board */
2213 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
2219 if (ioc
->sas_mgmt
.status
& MPT_MGMT_STATUS_RF_VALID
) {
2220 SmpPassthroughReply_t
*smprep
;
2222 smprep
= (SmpPassthroughReply_t
*)ioc
->sas_mgmt
.reply
;
2223 memcpy(req
->sense
, smprep
, sizeof(*smprep
));
2224 req
->sense_len
= sizeof(*smprep
);
2226 rsp
->resid_len
-= smprep
->ResponseDataLength
;
2228 printk(MYIOC_s_ERR_FMT
2229 "%s: smp passthru reply failed to be returned\n",
2230 ioc
->name
, __func__
);
2235 pci_unmap_single(ioc
->pcidev
, dma_addr_out
, blk_rq_bytes(req
),
2236 PCI_DMA_BIDIRECTIONAL
);
2238 pci_unmap_single(ioc
->pcidev
, dma_addr_in
, blk_rq_bytes(rsp
),
2239 PCI_DMA_BIDIRECTIONAL
);
2242 mpt_free_msg_frame(ioc
, mf
);
2244 CLEAR_MGMT_STATUS(ioc
->sas_mgmt
.status
)
2245 mutex_unlock(&ioc
->sas_mgmt
.mutex
);
2250 static struct sas_function_template mptsas_transport_functions
= {
2251 .get_linkerrors
= mptsas_get_linkerrors
,
2252 .get_enclosure_identifier
= mptsas_get_enclosure_identifier
,
2253 .get_bay_identifier
= mptsas_get_bay_identifier
,
2254 .phy_reset
= mptsas_phy_reset
,
2255 .smp_handler
= mptsas_smp_handler
,
2258 static struct scsi_transport_template
*mptsas_transport_template
;
2261 mptsas_sas_io_unit_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
2263 ConfigExtendedPageHeader_t hdr
;
2265 SasIOUnitPage0_t
*buffer
;
2266 dma_addr_t dma_handle
;
2269 hdr
.PageVersion
= MPI_SASIOUNITPAGE0_PAGEVERSION
;
2270 hdr
.ExtPageLength
= 0;
2274 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2275 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2277 cfg
.cfghdr
.ehdr
= &hdr
;
2280 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2281 cfg
.dir
= 0; /* read */
2282 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2284 error
= mpt_config(ioc
, &cfg
);
2287 if (!hdr
.ExtPageLength
) {
2292 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2299 cfg
.physAddr
= dma_handle
;
2300 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2302 error
= mpt_config(ioc
, &cfg
);
2304 goto out_free_consistent
;
2306 port_info
->num_phys
= buffer
->NumPhys
;
2307 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2308 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2309 if (!port_info
->phy_info
) {
2311 goto out_free_consistent
;
2314 ioc
->nvdata_version_persistent
=
2315 le16_to_cpu(buffer
->NvdataVersionPersistent
);
2316 ioc
->nvdata_version_default
=
2317 le16_to_cpu(buffer
->NvdataVersionDefault
);
2319 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2320 mptsas_print_phy_data(ioc
, &buffer
->PhyData
[i
]);
2321 port_info
->phy_info
[i
].phy_id
= i
;
2322 port_info
->phy_info
[i
].port_id
=
2323 buffer
->PhyData
[i
].Port
;
2324 port_info
->phy_info
[i
].negotiated_link_rate
=
2325 buffer
->PhyData
[i
].NegotiatedLinkRate
;
2326 port_info
->phy_info
[i
].portinfo
= port_info
;
2327 port_info
->phy_info
[i
].handle
=
2328 le16_to_cpu(buffer
->PhyData
[i
].ControllerDevHandle
);
2331 out_free_consistent
:
2332 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2333 buffer
, dma_handle
);
2339 mptsas_sas_io_unit_pg1(MPT_ADAPTER
*ioc
)
2341 ConfigExtendedPageHeader_t hdr
;
2343 SasIOUnitPage1_t
*buffer
;
2344 dma_addr_t dma_handle
;
2346 u16 device_missing_delay
;
2348 memset(&hdr
, 0, sizeof(ConfigExtendedPageHeader_t
));
2349 memset(&cfg
, 0, sizeof(CONFIGPARMS
));
2351 cfg
.cfghdr
.ehdr
= &hdr
;
2352 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2353 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2354 cfg
.cfghdr
.ehdr
->PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2355 cfg
.cfghdr
.ehdr
->ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT
;
2356 cfg
.cfghdr
.ehdr
->PageVersion
= MPI_SASIOUNITPAGE1_PAGEVERSION
;
2357 cfg
.cfghdr
.ehdr
->PageNumber
= 1;
2359 error
= mpt_config(ioc
, &cfg
);
2362 if (!hdr
.ExtPageLength
) {
2367 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2374 cfg
.physAddr
= dma_handle
;
2375 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2377 error
= mpt_config(ioc
, &cfg
);
2379 goto out_free_consistent
;
2381 ioc
->io_missing_delay
=
2382 le16_to_cpu(buffer
->IODeviceMissingDelay
);
2383 device_missing_delay
= le16_to_cpu(buffer
->ReportDeviceMissingDelay
);
2384 ioc
->device_missing_delay
= (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16
) ?
2385 (device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
) * 16 :
2386 device_missing_delay
& MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK
;
2388 out_free_consistent
:
2389 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2390 buffer
, dma_handle
);
2396 mptsas_sas_phy_pg0(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2397 u32 form
, u32 form_specific
)
2399 ConfigExtendedPageHeader_t hdr
;
2401 SasPhyPage0_t
*buffer
;
2402 dma_addr_t dma_handle
;
2405 hdr
.PageVersion
= MPI_SASPHY0_PAGEVERSION
;
2406 hdr
.ExtPageLength
= 0;
2410 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2411 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_PHY
;
2413 cfg
.cfghdr
.ehdr
= &hdr
;
2414 cfg
.dir
= 0; /* read */
2415 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2417 /* Get Phy Pg 0 for each Phy. */
2419 cfg
.pageAddr
= form
+ form_specific
;
2420 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2422 error
= mpt_config(ioc
, &cfg
);
2426 if (!hdr
.ExtPageLength
) {
2431 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2438 cfg
.physAddr
= dma_handle
;
2439 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2441 error
= mpt_config(ioc
, &cfg
);
2443 goto out_free_consistent
;
2445 mptsas_print_phy_pg0(ioc
, buffer
);
2447 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2448 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2449 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2450 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2452 out_free_consistent
:
2453 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2454 buffer
, dma_handle
);
2460 mptsas_sas_device_pg0(MPT_ADAPTER
*ioc
, struct mptsas_devinfo
*device_info
,
2461 u32 form
, u32 form_specific
)
2463 ConfigExtendedPageHeader_t hdr
;
2465 SasDevicePage0_t
*buffer
;
2466 dma_addr_t dma_handle
;
2470 hdr
.PageVersion
= MPI_SASDEVICE0_PAGEVERSION
;
2471 hdr
.ExtPageLength
= 0;
2475 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2476 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE
;
2478 cfg
.cfghdr
.ehdr
= &hdr
;
2479 cfg
.pageAddr
= form
+ form_specific
;
2481 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2482 cfg
.dir
= 0; /* read */
2483 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2485 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2486 error
= mpt_config(ioc
, &cfg
);
2489 if (!hdr
.ExtPageLength
) {
2494 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2501 cfg
.physAddr
= dma_handle
;
2502 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2504 error
= mpt_config(ioc
, &cfg
);
2506 goto out_free_consistent
;
2508 mptsas_print_device_pg0(ioc
, buffer
);
2510 memset(device_info
, 0, sizeof(struct mptsas_devinfo
));
2511 device_info
->handle
= le16_to_cpu(buffer
->DevHandle
);
2512 device_info
->handle_parent
= le16_to_cpu(buffer
->ParentDevHandle
);
2513 device_info
->handle_enclosure
=
2514 le16_to_cpu(buffer
->EnclosureHandle
);
2515 device_info
->slot
= le16_to_cpu(buffer
->Slot
);
2516 device_info
->phy_id
= buffer
->PhyNum
;
2517 device_info
->port_id
= buffer
->PhysicalPort
;
2518 device_info
->id
= buffer
->TargetID
;
2519 device_info
->phys_disk_num
= ~0;
2520 device_info
->channel
= buffer
->Bus
;
2521 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2522 device_info
->sas_address
= le64_to_cpu(sas_address
);
2523 device_info
->device_info
=
2524 le32_to_cpu(buffer
->DeviceInfo
);
2526 out_free_consistent
:
2527 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2528 buffer
, dma_handle
);
2534 mptsas_sas_expander_pg0(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
,
2535 u32 form
, u32 form_specific
)
2537 ConfigExtendedPageHeader_t hdr
;
2539 SasExpanderPage0_t
*buffer
;
2540 dma_addr_t dma_handle
;
2544 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2545 hdr
.PageVersion
= MPI_SASEXPANDER0_PAGEVERSION
;
2546 hdr
.ExtPageLength
= 0;
2550 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2551 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2553 cfg
.cfghdr
.ehdr
= &hdr
;
2555 cfg
.pageAddr
= form
+ form_specific
;
2556 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2557 cfg
.dir
= 0; /* read */
2558 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2560 memset(port_info
, 0, sizeof(struct mptsas_portinfo
));
2561 error
= mpt_config(ioc
, &cfg
);
2565 if (!hdr
.ExtPageLength
) {
2570 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2577 cfg
.physAddr
= dma_handle
;
2578 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2580 error
= mpt_config(ioc
, &cfg
);
2582 goto out_free_consistent
;
2584 if (!buffer
->NumPhys
) {
2586 goto out_free_consistent
;
2589 /* save config data */
2590 port_info
->num_phys
= (buffer
->NumPhys
) ? buffer
->NumPhys
: 1;
2591 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
2592 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
2593 if (!port_info
->phy_info
) {
2595 goto out_free_consistent
;
2598 memcpy(&sas_address
, &buffer
->SASAddress
, sizeof(__le64
));
2599 for (i
= 0; i
< port_info
->num_phys
; i
++) {
2600 port_info
->phy_info
[i
].portinfo
= port_info
;
2601 port_info
->phy_info
[i
].handle
=
2602 le16_to_cpu(buffer
->DevHandle
);
2603 port_info
->phy_info
[i
].identify
.sas_address
=
2604 le64_to_cpu(sas_address
);
2605 port_info
->phy_info
[i
].identify
.handle_parent
=
2606 le16_to_cpu(buffer
->ParentDevHandle
);
2609 out_free_consistent
:
2610 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2611 buffer
, dma_handle
);
2617 mptsas_sas_expander_pg1(MPT_ADAPTER
*ioc
, struct mptsas_phyinfo
*phy_info
,
2618 u32 form
, u32 form_specific
)
2620 ConfigExtendedPageHeader_t hdr
;
2622 SasExpanderPage1_t
*buffer
;
2623 dma_addr_t dma_handle
;
2626 hdr
.PageVersion
= MPI_SASEXPANDER1_PAGEVERSION
;
2627 hdr
.ExtPageLength
= 0;
2631 hdr
.PageType
= MPI_CONFIG_PAGETYPE_EXTENDED
;
2632 hdr
.ExtPageType
= MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER
;
2634 cfg
.cfghdr
.ehdr
= &hdr
;
2636 cfg
.pageAddr
= form
+ form_specific
;
2637 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
2638 cfg
.dir
= 0; /* read */
2639 cfg
.timeout
= SAS_CONFIG_PAGE_TIMEOUT
;
2641 error
= mpt_config(ioc
, &cfg
);
2645 if (!hdr
.ExtPageLength
) {
2650 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2657 cfg
.physAddr
= dma_handle
;
2658 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
2660 error
= mpt_config(ioc
, &cfg
);
2662 if (error
== MPI_IOCSTATUS_CONFIG_INVALID_PAGE
) {
2668 goto out_free_consistent
;
2671 mptsas_print_expander_pg1(ioc
, buffer
);
2673 /* save config data */
2674 phy_info
->phy_id
= buffer
->PhyIdentifier
;
2675 phy_info
->port_id
= buffer
->PhysicalPort
;
2676 phy_info
->negotiated_link_rate
= buffer
->NegotiatedLinkRate
;
2677 phy_info
->programmed_link_rate
= buffer
->ProgrammedLinkRate
;
2678 phy_info
->hw_link_rate
= buffer
->HwLinkRate
;
2679 phy_info
->identify
.handle
= le16_to_cpu(buffer
->OwnerDevHandle
);
2680 phy_info
->attached
.handle
= le16_to_cpu(buffer
->AttachedDevHandle
);
2682 out_free_consistent
:
2683 pci_free_consistent(ioc
->pcidev
, hdr
.ExtPageLength
* 4,
2684 buffer
, dma_handle
);
2690 mptsas_parse_device_info(struct sas_identify
*identify
,
2691 struct mptsas_devinfo
*device_info
)
2695 identify
->sas_address
= device_info
->sas_address
;
2696 identify
->phy_identifier
= device_info
->phy_id
;
2699 * Fill in Phy Initiator Port Protocol.
2700 * Bits 6:3, more than one bit can be set, fall through cases.
2702 protocols
= device_info
->device_info
& 0x78;
2703 identify
->initiator_port_protocols
= 0;
2704 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_INITIATOR
)
2705 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SSP
;
2706 if (protocols
& MPI_SAS_DEVICE_INFO_STP_INITIATOR
)
2707 identify
->initiator_port_protocols
|= SAS_PROTOCOL_STP
;
2708 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_INITIATOR
)
2709 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SMP
;
2710 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_HOST
)
2711 identify
->initiator_port_protocols
|= SAS_PROTOCOL_SATA
;
2714 * Fill in Phy Target Port Protocol.
2715 * Bits 10:7, more than one bit can be set, fall through cases.
2717 protocols
= device_info
->device_info
& 0x780;
2718 identify
->target_port_protocols
= 0;
2719 if (protocols
& MPI_SAS_DEVICE_INFO_SSP_TARGET
)
2720 identify
->target_port_protocols
|= SAS_PROTOCOL_SSP
;
2721 if (protocols
& MPI_SAS_DEVICE_INFO_STP_TARGET
)
2722 identify
->target_port_protocols
|= SAS_PROTOCOL_STP
;
2723 if (protocols
& MPI_SAS_DEVICE_INFO_SMP_TARGET
)
2724 identify
->target_port_protocols
|= SAS_PROTOCOL_SMP
;
2725 if (protocols
& MPI_SAS_DEVICE_INFO_SATA_DEVICE
)
2726 identify
->target_port_protocols
|= SAS_PROTOCOL_SATA
;
2729 * Fill in Attached device type.
2731 switch (device_info
->device_info
&
2732 MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE
) {
2733 case MPI_SAS_DEVICE_INFO_NO_DEVICE
:
2734 identify
->device_type
= SAS_PHY_UNUSED
;
2736 case MPI_SAS_DEVICE_INFO_END_DEVICE
:
2737 identify
->device_type
= SAS_END_DEVICE
;
2739 case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
:
2740 identify
->device_type
= SAS_EDGE_EXPANDER_DEVICE
;
2742 case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
:
2743 identify
->device_type
= SAS_FANOUT_EXPANDER_DEVICE
;
2748 static int mptsas_probe_one_phy(struct device
*dev
,
2749 struct mptsas_phyinfo
*phy_info
, int index
, int local
)
2752 struct sas_phy
*phy
;
2753 struct sas_port
*port
;
2761 if (!phy_info
->phy
) {
2762 phy
= sas_phy_alloc(dev
, index
);
2768 phy
= phy_info
->phy
;
2770 mptsas_parse_device_info(&phy
->identify
, &phy_info
->identify
);
2773 * Set Negotiated link rate.
2775 switch (phy_info
->negotiated_link_rate
) {
2776 case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
:
2777 phy
->negotiated_linkrate
= SAS_PHY_DISABLED
;
2779 case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
:
2780 phy
->negotiated_linkrate
= SAS_LINK_RATE_FAILED
;
2782 case MPI_SAS_IOUNIT0_RATE_1_5
:
2783 phy
->negotiated_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
2785 case MPI_SAS_IOUNIT0_RATE_3_0
:
2786 phy
->negotiated_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
2788 case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE
:
2789 case MPI_SAS_IOUNIT0_RATE_UNKNOWN
:
2791 phy
->negotiated_linkrate
= SAS_LINK_RATE_UNKNOWN
;
2796 * Set Max hardware link rate.
2798 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
2799 case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5
:
2800 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
2802 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
2803 phy
->maximum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
2810 * Set Max programmed link rate.
2812 switch (phy_info
->programmed_link_rate
&
2813 MPI_SAS_PHY0_PRATE_MAX_RATE_MASK
) {
2814 case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5
:
2815 phy
->maximum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
2817 case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0
:
2818 phy
->maximum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
2825 * Set Min hardware link rate.
2827 switch (phy_info
->hw_link_rate
& MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK
) {
2828 case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5
:
2829 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_1_5_GBPS
;
2831 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
2832 phy
->minimum_linkrate_hw
= SAS_LINK_RATE_3_0_GBPS
;
2839 * Set Min programmed link rate.
2841 switch (phy_info
->programmed_link_rate
&
2842 MPI_SAS_PHY0_PRATE_MIN_RATE_MASK
) {
2843 case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5
:
2844 phy
->minimum_linkrate
= SAS_LINK_RATE_1_5_GBPS
;
2846 case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0
:
2847 phy
->minimum_linkrate
= SAS_LINK_RATE_3_0_GBPS
;
2853 if (!phy_info
->phy
) {
2855 error
= sas_phy_add(phy
);
2860 phy_info
->phy
= phy
;
2863 if (!phy_info
->attached
.handle
||
2864 !phy_info
->port_details
)
2867 port
= mptsas_get_port(phy_info
);
2868 ioc
= phy_to_ioc(phy_info
->phy
);
2870 if (phy_info
->sas_port_add_phy
) {
2873 port
= sas_port_alloc_num(dev
);
2878 error
= sas_port_add(port
);
2880 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
2881 "%s: exit at line=%d\n", ioc
->name
,
2882 __func__
, __LINE__
));
2885 mptsas_set_port(ioc
, phy_info
, port
);
2886 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &port
->dev
,
2887 MYIOC_s_FMT
"add port %d, sas_addr (0x%llx)\n",
2888 ioc
->name
, port
->port_identifier
,
2889 (unsigned long long)phy_info
->
2890 attached
.sas_address
));
2892 dsaswideprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
2893 "sas_port_add_phy: phy_id=%d\n",
2894 ioc
->name
, phy_info
->phy_id
));
2895 sas_port_add_phy(port
, phy_info
->phy
);
2896 phy_info
->sas_port_add_phy
= 0;
2897 devtprintk(ioc
, dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
2898 MYIOC_s_FMT
"add phy %d, phy-obj (0x%p)\n", ioc
->name
,
2899 phy_info
->phy_id
, phy_info
->phy
));
2901 if (!mptsas_get_rphy(phy_info
) && port
&& !port
->rphy
) {
2903 struct sas_rphy
*rphy
;
2904 struct device
*parent
;
2905 struct sas_identify identify
;
2907 parent
= dev
->parent
->parent
;
2909 * Let the hotplug_work thread handle processing
2910 * the adding/removing of devices that occur
2911 * after start of day.
2913 if (mptsas_is_end_device(&phy_info
->attached
) &&
2914 phy_info
->attached
.handle_parent
) {
2918 mptsas_parse_device_info(&identify
, &phy_info
->attached
);
2919 if (scsi_is_host_device(parent
)) {
2920 struct mptsas_portinfo
*port_info
;
2923 port_info
= ioc
->hba_port_info
;
2925 for (i
= 0; i
< port_info
->num_phys
; i
++)
2926 if (port_info
->phy_info
[i
].identify
.sas_address
==
2927 identify
.sas_address
) {
2928 sas_port_mark_backlink(port
);
2932 } else if (scsi_is_sas_rphy(parent
)) {
2933 struct sas_rphy
*parent_rphy
= dev_to_rphy(parent
);
2934 if (identify
.sas_address
==
2935 parent_rphy
->identify
.sas_address
) {
2936 sas_port_mark_backlink(port
);
2941 switch (identify
.device_type
) {
2942 case SAS_END_DEVICE
:
2943 rphy
= sas_end_device_alloc(port
);
2945 case SAS_EDGE_EXPANDER_DEVICE
:
2946 case SAS_FANOUT_EXPANDER_DEVICE
:
2947 rphy
= sas_expander_alloc(port
, identify
.device_type
);
2954 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
2955 "%s: exit at line=%d\n", ioc
->name
,
2956 __func__
, __LINE__
));
2960 rphy
->identify
= identify
;
2961 error
= sas_rphy_add(rphy
);
2963 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
2964 "%s: exit at line=%d\n", ioc
->name
,
2965 __func__
, __LINE__
));
2966 sas_rphy_free(rphy
);
2969 mptsas_set_rphy(ioc
, phy_info
, rphy
);
2977 mptsas_probe_hba_phys(MPT_ADAPTER
*ioc
)
2979 struct mptsas_portinfo
*port_info
, *hba
;
2980 int error
= -ENOMEM
, i
;
2982 hba
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
2986 error
= mptsas_sas_io_unit_pg0(ioc
, hba
);
2988 goto out_free_port_info
;
2990 mptsas_sas_io_unit_pg1(ioc
);
2991 mutex_lock(&ioc
->sas_topology_mutex
);
2992 port_info
= ioc
->hba_port_info
;
2994 ioc
->hba_port_info
= port_info
= hba
;
2995 ioc
->hba_port_num_phy
= port_info
->num_phys
;
2996 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
2998 for (i
= 0; i
< hba
->num_phys
; i
++) {
2999 port_info
->phy_info
[i
].negotiated_link_rate
=
3000 hba
->phy_info
[i
].negotiated_link_rate
;
3001 port_info
->phy_info
[i
].handle
=
3002 hba
->phy_info
[i
].handle
;
3003 port_info
->phy_info
[i
].port_id
=
3004 hba
->phy_info
[i
].port_id
;
3006 kfree(hba
->phy_info
);
3010 mutex_unlock(&ioc
->sas_topology_mutex
);
3011 #if defined(CPQ_CIM)
3012 ioc
->num_ports
= port_info
->num_phys
;
3014 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3015 mptsas_sas_phy_pg0(ioc
, &port_info
->phy_info
[i
],
3016 (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER
<<
3017 MPI_SAS_PHY_PGAD_FORM_SHIFT
), i
);
3018 port_info
->phy_info
[i
].identify
.handle
=
3019 port_info
->phy_info
[i
].handle
;
3020 mptsas_sas_device_pg0(ioc
, &port_info
->phy_info
[i
].identify
,
3021 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3022 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3023 port_info
->phy_info
[i
].identify
.handle
);
3024 if (!ioc
->hba_port_sas_addr
)
3025 ioc
->hba_port_sas_addr
=
3026 port_info
->phy_info
[i
].identify
.sas_address
;
3027 port_info
->phy_info
[i
].identify
.phy_id
=
3028 port_info
->phy_info
[i
].phy_id
= i
;
3029 if (port_info
->phy_info
[i
].attached
.handle
)
3030 mptsas_sas_device_pg0(ioc
,
3031 &port_info
->phy_info
[i
].attached
,
3032 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3033 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3034 port_info
->phy_info
[i
].attached
.handle
);
3037 mptsas_setup_wide_ports(ioc
, port_info
);
3039 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3040 mptsas_probe_one_phy(&ioc
->sh
->shost_gendev
,
3041 &port_info
->phy_info
[i
], ioc
->sas_index
, 1);
3052 mptsas_expander_refresh(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
*port_info
)
3054 struct mptsas_portinfo
*parent
;
3055 struct device
*parent_dev
;
3056 struct sas_rphy
*rphy
;
3058 u64 sas_address
; /* expander sas address */
3061 handle
= port_info
->phy_info
[0].handle
;
3062 sas_address
= port_info
->phy_info
[0].identify
.sas_address
;
3063 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3064 mptsas_sas_expander_pg1(ioc
, &port_info
->phy_info
[i
],
3065 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM
<<
3066 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), (i
<< 16) + handle
);
3068 mptsas_sas_device_pg0(ioc
,
3069 &port_info
->phy_info
[i
].identify
,
3070 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3071 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3072 port_info
->phy_info
[i
].identify
.handle
);
3073 port_info
->phy_info
[i
].identify
.phy_id
=
3074 port_info
->phy_info
[i
].phy_id
;
3076 if (port_info
->phy_info
[i
].attached
.handle
) {
3077 mptsas_sas_device_pg0(ioc
,
3078 &port_info
->phy_info
[i
].attached
,
3079 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE
<<
3080 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3081 port_info
->phy_info
[i
].attached
.handle
);
3082 port_info
->phy_info
[i
].attached
.phy_id
=
3083 port_info
->phy_info
[i
].phy_id
;
3087 mutex_lock(&ioc
->sas_topology_mutex
);
3088 parent
= mptsas_find_portinfo_by_handle(ioc
,
3089 port_info
->phy_info
[0].identify
.handle_parent
);
3091 mutex_unlock(&ioc
->sas_topology_mutex
);
3094 for (i
= 0, parent_dev
= NULL
; i
< parent
->num_phys
&& !parent_dev
;
3096 if (parent
->phy_info
[i
].attached
.sas_address
== sas_address
) {
3097 rphy
= mptsas_get_rphy(&parent
->phy_info
[i
]);
3098 parent_dev
= &rphy
->dev
;
3101 mutex_unlock(&ioc
->sas_topology_mutex
);
3103 mptsas_setup_wide_ports(ioc
, port_info
);
3104 for (i
= 0; i
< port_info
->num_phys
; i
++, ioc
->sas_index
++)
3105 mptsas_probe_one_phy(parent_dev
, &port_info
->phy_info
[i
],
3110 mptsas_expander_event_add(MPT_ADAPTER
*ioc
,
3111 MpiEventDataSasExpanderStatusChange_t
*expander_data
)
3113 struct mptsas_portinfo
*port_info
;
3117 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3120 port_info
->num_phys
= (expander_data
->NumPhys
) ?
3121 expander_data
->NumPhys
: 1;
3122 port_info
->phy_info
= kcalloc(port_info
->num_phys
,
3123 sizeof(struct mptsas_phyinfo
), GFP_KERNEL
);
3124 if (!port_info
->phy_info
)
3126 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3127 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3128 port_info
->phy_info
[i
].portinfo
= port_info
;
3129 port_info
->phy_info
[i
].handle
=
3130 le16_to_cpu(expander_data
->DevHandle
);
3131 port_info
->phy_info
[i
].identify
.sas_address
=
3132 le64_to_cpu(sas_address
);
3133 port_info
->phy_info
[i
].identify
.handle_parent
=
3134 le16_to_cpu(expander_data
->ParentDevHandle
);
3137 mutex_lock(&ioc
->sas_topology_mutex
);
3138 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3139 mutex_unlock(&ioc
->sas_topology_mutex
);
3141 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3142 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3143 (unsigned long long)sas_address
);
3145 mptsas_expander_refresh(ioc
, port_info
);
3149 * mptsas_delete_expander_siblings - remove siblings attached to expander
3150 * @ioc: Pointer to MPT_ADAPTER structure
3151 * @parent: the parent port_info object
3152 * @expander: the expander port_info object
3155 mptsas_delete_expander_siblings(MPT_ADAPTER
*ioc
, struct mptsas_portinfo
3156 *parent
, struct mptsas_portinfo
*expander
)
3158 struct mptsas_phyinfo
*phy_info
;
3159 struct mptsas_portinfo
*port_info
;
3160 struct sas_rphy
*rphy
;
3163 phy_info
= expander
->phy_info
;
3164 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3165 rphy
= mptsas_get_rphy(phy_info
);
3168 if (rphy
->identify
.device_type
== SAS_END_DEVICE
)
3169 mptsas_del_end_device(ioc
, phy_info
);
3172 phy_info
= expander
->phy_info
;
3173 for (i
= 0; i
< expander
->num_phys
; i
++, phy_info
++) {
3174 rphy
= mptsas_get_rphy(phy_info
);
3177 if (rphy
->identify
.device_type
==
3178 MPI_SAS_DEVICE_INFO_EDGE_EXPANDER
||
3179 rphy
->identify
.device_type
==
3180 MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER
) {
3181 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3182 rphy
->identify
.sas_address
);
3185 if (port_info
== parent
) /* backlink rphy */
3188 Delete this expander even if the expdevpage is exists
3189 because the parent expander is already deleted
3191 mptsas_expander_delete(ioc
, port_info
, 1);
3198 * mptsas_expander_delete - remove this expander
3199 * @ioc: Pointer to MPT_ADAPTER structure
3200 * @port_info: expander port_info struct
3201 * @force: Flag to forcefully delete the expander
3205 static void mptsas_expander_delete(MPT_ADAPTER
*ioc
,
3206 struct mptsas_portinfo
*port_info
, u8 force
)
3209 struct mptsas_portinfo
*parent
;
3211 u64 expander_sas_address
;
3212 struct mptsas_phyinfo
*phy_info
;
3213 struct mptsas_portinfo buffer
;
3214 struct mptsas_portinfo_details
*port_details
;
3215 struct sas_port
*port
;
3220 /* see if expander is still there before deleting */
3221 mptsas_sas_expander_pg0(ioc
, &buffer
,
3222 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3223 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
),
3224 port_info
->phy_info
[0].identify
.handle
);
3226 if (buffer
.num_phys
) {
3227 kfree(buffer
.phy_info
);
3234 * Obtain the port_info instance to the parent port
3236 port_details
= NULL
;
3237 expander_sas_address
=
3238 port_info
->phy_info
[0].identify
.sas_address
;
3239 parent
= mptsas_find_portinfo_by_handle(ioc
,
3240 port_info
->phy_info
[0].identify
.handle_parent
);
3241 mptsas_delete_expander_siblings(ioc
, parent
, port_info
);
3246 * Delete rphys in the parent that point
3249 phy_info
= parent
->phy_info
;
3251 for (i
= 0; i
< parent
->num_phys
; i
++, phy_info
++) {
3254 if (phy_info
->attached
.sas_address
!=
3255 expander_sas_address
)
3258 port
= mptsas_get_port(phy_info
);
3259 port_details
= phy_info
->port_details
;
3261 dev_printk(KERN_DEBUG
, &phy_info
->phy
->dev
,
3262 MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n", ioc
->name
,
3263 phy_info
->phy_id
, phy_info
->phy
);
3264 sas_port_delete_phy(port
, phy_info
->phy
);
3267 dev_printk(KERN_DEBUG
, &port
->dev
,
3268 MYIOC_s_FMT
"delete port %d, sas_addr (0x%llx)\n",
3269 ioc
->name
, port
->port_identifier
,
3270 (unsigned long long)expander_sas_address
);
3271 sas_port_delete(port
);
3272 mptsas_port_delete(ioc
, port_details
);
3276 printk(MYIOC_s_INFO_FMT
"delete expander: num_phys %d, "
3277 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3278 (unsigned long long)expander_sas_address
);
3283 list_del(&port_info
->list
);
3284 kfree(port_info
->phy_info
);
3290 * mptsas_send_expander_event - expanders events
3291 * @ioc: Pointer to MPT_ADAPTER structure
3292 * @expander_data: event data
3295 * This function handles adding, removing, and refreshing
3296 * device handles within the expander objects.
3299 mptsas_send_expander_event(struct fw_event_work
*fw_event
)
3302 MpiEventDataSasExpanderStatusChange_t
*expander_data
;
3303 struct mptsas_portinfo
*port_info
;
3307 ioc
= fw_event
->ioc
;
3308 expander_data
= (MpiEventDataSasExpanderStatusChange_t
*)
3309 fw_event
->event_data
;
3310 memcpy(&sas_address
, &expander_data
->SASAddress
, sizeof(__le64
));
3311 sas_address
= le64_to_cpu(sas_address
);
3312 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3314 if (expander_data
->ReasonCode
== MPI_EVENT_SAS_EXP_RC_ADDED
) {
3316 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3317 port_info
->phy_info
[i
].portinfo
= port_info
;
3318 port_info
->phy_info
[i
].handle
=
3319 le16_to_cpu(expander_data
->DevHandle
);
3320 port_info
->phy_info
[i
].identify
.sas_address
=
3321 le64_to_cpu(sas_address
);
3322 port_info
->phy_info
[i
].identify
.handle_parent
=
3323 le16_to_cpu(expander_data
->ParentDevHandle
);
3325 mptsas_expander_refresh(ioc
, port_info
);
3326 } else if (!port_info
&& expander_data
->NumPhys
)
3327 mptsas_expander_event_add(ioc
, expander_data
);
3328 } else if (expander_data
->ReasonCode
==
3329 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
)
3330 mptsas_expander_delete(ioc
, port_info
, 0);
3332 mptsas_free_fw_event(ioc
, fw_event
);
3337 * mptsas_expander_add -
3338 * @ioc: Pointer to MPT_ADAPTER structure
3342 struct mptsas_portinfo
*
3343 mptsas_expander_add(MPT_ADAPTER
*ioc
, u16 handle
)
3345 struct mptsas_portinfo buffer
, *port_info
;
3348 if ((mptsas_sas_expander_pg0(ioc
, &buffer
,
3349 (MPI_SAS_EXPAND_PGAD_FORM_HANDLE
<<
3350 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)))
3353 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_ATOMIC
);
3355 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3356 "%s: exit at line=%d\n", ioc
->name
,
3357 __func__
, __LINE__
));
3360 port_info
->num_phys
= buffer
.num_phys
;
3361 port_info
->phy_info
= buffer
.phy_info
;
3362 for (i
= 0; i
< port_info
->num_phys
; i
++)
3363 port_info
->phy_info
[i
].portinfo
= port_info
;
3364 mutex_lock(&ioc
->sas_topology_mutex
);
3365 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3366 mutex_unlock(&ioc
->sas_topology_mutex
);
3367 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3368 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3369 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3370 mptsas_expander_refresh(ioc
, port_info
);
3375 mptsas_send_link_status_event(struct fw_event_work
*fw_event
)
3378 MpiEventDataSasPhyLinkStatus_t
*link_data
;
3379 struct mptsas_portinfo
*port_info
;
3380 struct mptsas_phyinfo
*phy_info
= NULL
;
3385 ioc
= fw_event
->ioc
;
3386 link_data
= (MpiEventDataSasPhyLinkStatus_t
*)fw_event
->event_data
;
3388 memcpy(&sas_address
, &link_data
->SASAddress
, sizeof(__le64
));
3389 sas_address
= le64_to_cpu(sas_address
);
3390 link_rate
= link_data
->LinkRates
>> 4;
3391 phy_num
= link_data
->PhyNum
;
3393 port_info
= mptsas_find_portinfo_by_sas_address(ioc
, sas_address
);
3395 phy_info
= &port_info
->phy_info
[phy_num
];
3397 phy_info
->negotiated_link_rate
= link_rate
;
3400 if (link_rate
== MPI_SAS_IOUNIT0_RATE_1_5
||
3401 link_rate
== MPI_SAS_IOUNIT0_RATE_3_0
) {
3404 if (ioc
->old_sas_discovery_protocal
) {
3405 port_info
= mptsas_expander_add(ioc
,
3406 le16_to_cpu(link_data
->DevHandle
));
3413 if (port_info
== ioc
->hba_port_info
)
3414 mptsas_probe_hba_phys(ioc
);
3416 mptsas_expander_refresh(ioc
, port_info
);
3417 } else if (phy_info
&& phy_info
->phy
) {
3418 if (link_rate
== MPI_SAS_IOUNIT0_RATE_PHY_DISABLED
)
3419 phy_info
->phy
->negotiated_linkrate
=
3421 else if (link_rate
==
3422 MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION
)
3423 phy_info
->phy
->negotiated_linkrate
=
3424 SAS_LINK_RATE_FAILED
;
3426 phy_info
->phy
->negotiated_linkrate
=
3427 SAS_LINK_RATE_UNKNOWN
;
3430 mptsas_free_fw_event(ioc
, fw_event
);
3434 mptsas_not_responding_devices(MPT_ADAPTER
*ioc
)
3436 struct mptsas_portinfo buffer
, *port_info
;
3437 struct mptsas_device_info
*sas_info
;
3438 struct mptsas_devinfo sas_device
;
3440 VirtTarget
*vtarget
= NULL
;
3441 struct mptsas_phyinfo
*phy_info
;
3443 int retval
, retry_count
;
3444 unsigned long flags
;
3446 mpt_findImVolumes(ioc
);
3448 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3449 if (ioc
->ioc_reset_in_progress
) {
3450 dfailprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3451 "%s: exiting due to a parallel reset \n", ioc
->name
,
3453 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3456 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
, flags
);
3458 /* devices, logical volumes */
3459 mutex_lock(&ioc
->sas_device_info_mutex
);
3461 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
, list
) {
3462 if (sas_info
->is_cached
)
3464 if (!sas_info
->is_logical_volume
) {
3465 sas_device
.handle
= 0;
3468 retval
= mptsas_sas_device_pg0(ioc
, &sas_device
,
3469 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
3470 << MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3471 (sas_info
->fw
.channel
<< 8) +
3474 if (sas_device
.handle
)
3476 if (retval
== -EBUSY
) {
3477 spin_lock_irqsave(&ioc
->taskmgmt_lock
, flags
);
3478 if (ioc
->ioc_reset_in_progress
) {
3480 printk(MYIOC_s_DEBUG_FMT
3481 "%s: exiting due to reset\n",
3482 ioc
->name
, __func__
));
3483 spin_unlock_irqrestore
3484 (&ioc
->taskmgmt_lock
, flags
);
3486 sas_device_info_mutex
);
3489 spin_unlock_irqrestore(&ioc
->taskmgmt_lock
,
3493 if (retval
&& (retval
!= -ENODEV
)) {
3494 if (retry_count
< 10) {
3498 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
3499 "%s: Config page retry exceeded retry "
3500 "count deleting device 0x%llx\n",
3501 ioc
->name
, __func__
,
3502 sas_info
->sas_address
));
3507 vtarget
= mptsas_find_vtarget(ioc
,
3508 sas_info
->fw
.channel
, sas_info
->fw
.id
);
3511 vtarget
->deleted
= 1;
3513 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
3514 sas_info
->sas_address
);
3517 mptsas_del_end_device(ioc
, phy_info
);
3518 goto redo_device_scan
;
3521 mptsas_volume_delete(ioc
, sas_info
->fw
.id
);
3523 mutex_unlock(&ioc
->sas_device_info_mutex
);
3526 mutex_lock(&ioc
->sas_topology_mutex
);
3528 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3530 if (port_info
->phy_info
&&
3531 (!(port_info
->phy_info
[0].identify
.device_info
&
3532 MPI_SAS_DEVICE_INFO_SMP_TARGET
)))
3536 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3537 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3538 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
) &&
3541 handle
= buffer
.phy_info
[0].handle
;
3542 if (buffer
.phy_info
[0].identify
.sas_address
==
3543 port_info
->phy_info
[0].identify
.sas_address
) {
3546 kfree(buffer
.phy_info
);
3549 if (!found_expander
) {
3550 mptsas_expander_delete(ioc
, port_info
, 0);
3551 goto redo_expander_scan
;
3554 mutex_unlock(&ioc
->sas_topology_mutex
);
3558 * mptsas_probe_expanders - adding expanders
3559 * @ioc: Pointer to MPT_ADAPTER structure
3563 mptsas_probe_expanders(MPT_ADAPTER
*ioc
)
3565 struct mptsas_portinfo buffer
, *port_info
;
3570 while (!mptsas_sas_expander_pg0(ioc
, &buffer
,
3571 (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE
<<
3572 MPI_SAS_EXPAND_PGAD_FORM_SHIFT
), handle
)) {
3574 handle
= buffer
.phy_info
[0].handle
;
3575 port_info
= mptsas_find_portinfo_by_sas_address(ioc
,
3576 buffer
.phy_info
[0].identify
.sas_address
);
3579 /* refreshing handles */
3580 for (i
= 0; i
< buffer
.num_phys
; i
++) {
3581 port_info
->phy_info
[i
].handle
= handle
;
3582 port_info
->phy_info
[i
].identify
.handle_parent
=
3583 buffer
.phy_info
[0].identify
.handle_parent
;
3585 mptsas_expander_refresh(ioc
, port_info
);
3586 kfree(buffer
.phy_info
);
3590 port_info
= kzalloc(sizeof(struct mptsas_portinfo
), GFP_KERNEL
);
3592 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
3593 "%s: exit at line=%d\n", ioc
->name
,
3594 __func__
, __LINE__
));
3597 port_info
->num_phys
= buffer
.num_phys
;
3598 port_info
->phy_info
= buffer
.phy_info
;
3599 for (i
= 0; i
< port_info
->num_phys
; i
++)
3600 port_info
->phy_info
[i
].portinfo
= port_info
;
3601 mutex_lock(&ioc
->sas_topology_mutex
);
3602 list_add_tail(&port_info
->list
, &ioc
->sas_topology
);
3603 mutex_unlock(&ioc
->sas_topology_mutex
);
3604 printk(MYIOC_s_INFO_FMT
"add expander: num_phys %d, "
3605 "sas_addr (0x%llx)\n", ioc
->name
, port_info
->num_phys
,
3606 (unsigned long long)buffer
.phy_info
[0].identify
.sas_address
);
3607 mptsas_expander_refresh(ioc
, port_info
);
3612 mptsas_probe_devices(MPT_ADAPTER
*ioc
)
3615 struct mptsas_devinfo sas_device
;
3616 struct mptsas_phyinfo
*phy_info
;
3619 while (!(mptsas_sas_device_pg0(ioc
, &sas_device
,
3620 MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE
, handle
))) {
3622 handle
= sas_device
.handle
;
3624 if ((sas_device
.device_info
&
3625 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
3626 MPI_SAS_DEVICE_INFO_STP_TARGET
|
3627 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0)
3630 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
3634 if (mptsas_get_rphy(phy_info
))
3637 mptsas_add_end_device(ioc
, phy_info
);
3642 * mptsas_scan_sas_topology -
3643 * @ioc: Pointer to MPT_ADAPTER structure
3648 mptsas_scan_sas_topology(MPT_ADAPTER
*ioc
)
3650 struct scsi_device
*sdev
;
3653 mptsas_probe_hba_phys(ioc
);
3654 mptsas_probe_expanders(ioc
);
3655 mptsas_probe_devices(ioc
);
3658 Reporting RAID volumes.
3660 if (!ioc
->ir_firmware
|| !ioc
->raid_data
.pIocPg2
||
3661 !ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
3663 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
3664 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3665 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3667 scsi_device_put(sdev
);
3670 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
3671 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
3672 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
);
3673 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
3674 ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
, 0);
3680 mptsas_handle_queue_full_event(struct fw_event_work
*fw_event
)
3683 EventDataQueueFull_t
*qfull_data
;
3684 struct mptsas_device_info
*sas_info
;
3685 struct scsi_device
*sdev
;
3689 int fw_id
, fw_channel
;
3693 ioc
= fw_event
->ioc
;
3694 qfull_data
= (EventDataQueueFull_t
*)fw_event
->event_data
;
3695 fw_id
= qfull_data
->TargetID
;
3696 fw_channel
= qfull_data
->Bus
;
3697 current_depth
= le16_to_cpu(qfull_data
->CurrentDepth
);
3699 /* if hidden raid component, look for the volume id */
3700 mutex_lock(&ioc
->sas_device_info_mutex
);
3701 if (mptscsih_is_phys_disk(ioc
, fw_channel
, fw_id
)) {
3702 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3704 if (sas_info
->is_cached
||
3705 sas_info
->is_logical_volume
)
3707 if (sas_info
->is_hidden_raid_component
&&
3708 (sas_info
->fw
.channel
== fw_channel
&&
3709 sas_info
->fw
.id
== fw_id
)) {
3710 id
= sas_info
->volume_id
;
3711 channel
= MPTSAS_RAID_CHANNEL
;
3716 list_for_each_entry(sas_info
, &ioc
->sas_device_info_list
,
3718 if (sas_info
->is_cached
||
3719 sas_info
->is_hidden_raid_component
||
3720 sas_info
->is_logical_volume
)
3722 if (sas_info
->fw
.channel
== fw_channel
&&
3723 sas_info
->fw
.id
== fw_id
) {
3724 id
= sas_info
->os
.id
;
3725 channel
= sas_info
->os
.channel
;
3733 mutex_unlock(&ioc
->sas_device_info_mutex
);
3736 shost_for_each_device(sdev
, ioc
->sh
) {
3737 if (sdev
->id
== id
&& sdev
->channel
== channel
) {
3738 if (current_depth
> sdev
->queue_depth
) {
3739 sdev_printk(KERN_INFO
, sdev
,
3740 "strange observation, the queue "
3741 "depth is (%d) meanwhile fw queue "
3742 "depth (%d)\n", sdev
->queue_depth
,
3746 depth
= scsi_track_queue_full(sdev
,
3749 sdev_printk(KERN_INFO
, sdev
,
3750 "Queue depth reduced to (%d)\n",
3753 sdev_printk(KERN_INFO
, sdev
,
3754 "Tagged Command Queueing is being "
3756 else if (depth
== 0)
3757 sdev_printk(KERN_INFO
, sdev
,
3758 "Queue depth not changed yet\n");
3763 mptsas_free_fw_event(ioc
, fw_event
);
3767 static struct mptsas_phyinfo
*
3768 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER
*ioc
, u64 sas_address
)
3770 struct mptsas_portinfo
*port_info
;
3771 struct mptsas_phyinfo
*phy_info
= NULL
;
3774 mutex_lock(&ioc
->sas_topology_mutex
);
3775 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3776 for (i
= 0; i
< port_info
->num_phys
; i
++) {
3777 if (!mptsas_is_end_device(
3778 &port_info
->phy_info
[i
].attached
))
3780 if (port_info
->phy_info
[i
].attached
.sas_address
3783 phy_info
= &port_info
->phy_info
[i
];
3787 mutex_unlock(&ioc
->sas_topology_mutex
);
3792 * mptsas_find_phyinfo_by_phys_disk_num -
3793 * @ioc: Pointer to MPT_ADAPTER structure
3799 static struct mptsas_phyinfo
*
3800 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER
*ioc
, u8 phys_disk_num
,
3803 struct mptsas_phyinfo
*phy_info
= NULL
;
3804 struct mptsas_portinfo
*port_info
;
3805 RaidPhysDiskPage1_t
*phys_disk
= NULL
;
3807 u64 sas_address
= 0;
3811 if (!ioc
->raid_data
.pIocPg3
)
3813 /* dual port support */
3814 num_paths
= mpt_raid_phys_disk_get_num_paths(ioc
, phys_disk_num
);
3817 phys_disk
= kzalloc(offsetof(RaidPhysDiskPage1_t
, Path
) +
3818 (num_paths
* sizeof(RAID_PHYS_DISK1_PATH
)), GFP_KERNEL
);
3821 mpt_raid_phys_disk_pg1(ioc
, phys_disk_num
, phys_disk
);
3822 for (i
= 0; i
< num_paths
; i
++) {
3823 if ((phys_disk
->Path
[i
].Flags
& 1) != 0)
3824 /* entry no longer valid */
3826 if ((id
== phys_disk
->Path
[i
].PhysDiskID
) &&
3827 (channel
== phys_disk
->Path
[i
].PhysDiskBus
)) {
3828 memcpy(&sas_address
, &phys_disk
->Path
[i
].WWID
,
3830 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
3842 * Extra code to handle RAID0 case, where the sas_address is not updated
3843 * in phys_disk_page_1 when hotswapped
3845 mutex_lock(&ioc
->sas_topology_mutex
);
3846 list_for_each_entry(port_info
, &ioc
->sas_topology
, list
) {
3847 for (i
= 0; i
< port_info
->num_phys
&& !phy_info
; i
++) {
3848 if (!mptsas_is_end_device(
3849 &port_info
->phy_info
[i
].attached
))
3851 if (port_info
->phy_info
[i
].attached
.phys_disk_num
== ~0)
3853 if ((port_info
->phy_info
[i
].attached
.phys_disk_num
==
3855 (port_info
->phy_info
[i
].attached
.id
== id
) &&
3856 (port_info
->phy_info
[i
].attached
.channel
==
3858 phy_info
= &port_info
->phy_info
[i
];
3861 mutex_unlock(&ioc
->sas_topology_mutex
);
3866 mptsas_reprobe_lun(struct scsi_device
*sdev
, void *data
)
3870 sdev
->no_uld_attach
= data
? 1 : 0;
3871 rc
= scsi_device_reprobe(sdev
);
3875 mptsas_reprobe_target(struct scsi_target
*starget
, int uld_attach
)
3877 starget_for_each_device(starget
, uld_attach
? (void *)1 : NULL
,
3878 mptsas_reprobe_lun
);
3882 mptsas_adding_inactive_raid_components(MPT_ADAPTER
*ioc
, u8 channel
, u8 id
)
3885 ConfigPageHeader_t hdr
;
3886 dma_addr_t dma_handle
;
3887 pRaidVolumePage0_t buffer
= NULL
;
3888 RaidPhysDiskPage0_t phys_disk
;
3890 struct mptsas_phyinfo
*phy_info
;
3891 struct mptsas_devinfo sas_device
;
3893 memset(&cfg
, 0 , sizeof(CONFIGPARMS
));
3894 memset(&hdr
, 0 , sizeof(ConfigPageHeader_t
));
3895 hdr
.PageType
= MPI_CONFIG_PAGETYPE_RAID_VOLUME
;
3896 cfg
.pageAddr
= (channel
<< 8) + id
;
3897 cfg
.cfghdr
.hdr
= &hdr
;
3898 cfg
.action
= MPI_CONFIG_ACTION_PAGE_HEADER
;
3900 if (mpt_config(ioc
, &cfg
) != 0)
3903 if (!hdr
.PageLength
)
3906 buffer
= pci_alloc_consistent(ioc
->pcidev
, hdr
.PageLength
* 4,
3912 cfg
.physAddr
= dma_handle
;
3913 cfg
.action
= MPI_CONFIG_ACTION_PAGE_READ_CURRENT
;
3915 if (mpt_config(ioc
, &cfg
) != 0)
3918 if (!(buffer
->VolumeStatus
.Flags
&
3919 MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE
))
3922 if (!buffer
->NumPhysDisks
)
3925 for (i
= 0; i
< buffer
->NumPhysDisks
; i
++) {
3927 if (mpt_raid_phys_disk_pg0(ioc
,
3928 buffer
->PhysDisk
[i
].PhysDiskNum
, &phys_disk
) != 0)
3931 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
3932 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
3933 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3934 (phys_disk
.PhysDiskBus
<< 8) +
3935 phys_disk
.PhysDiskID
))
3938 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
3939 sas_device
.sas_address
);
3940 mptsas_add_end_device(ioc
, phy_info
);
3945 pci_free_consistent(ioc
->pcidev
, hdr
.PageLength
* 4, buffer
,
3949 * Work queue thread to handle SAS hotplug events
3952 mptsas_hotplug_work(MPT_ADAPTER
*ioc
, struct fw_event_work
*fw_event
,
3953 struct mptsas_hotplug_event
*hot_plug_info
)
3955 struct mptsas_phyinfo
*phy_info
;
3956 struct scsi_target
* starget
;
3957 struct mptsas_devinfo sas_device
;
3958 VirtTarget
*vtarget
;
3961 switch (hot_plug_info
->event_type
) {
3963 case MPTSAS_ADD_PHYSDISK
:
3965 if (!ioc
->raid_data
.pIocPg2
)
3968 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++) {
3969 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
==
3970 hot_plug_info
->id
) {
3971 printk(MYIOC_s_WARN_FMT
"firmware bug: unable "
3972 "to add hidden disk - target_id matchs "
3973 "volume_id\n", ioc
->name
);
3974 mptsas_free_fw_event(ioc
, fw_event
);
3978 mpt_findImVolumes(ioc
);
3980 case MPTSAS_ADD_DEVICE
:
3981 memset(&sas_device
, 0, sizeof(struct mptsas_devinfo
));
3982 mptsas_sas_device_pg0(ioc
, &sas_device
,
3983 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
3984 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
3985 (hot_plug_info
->channel
<< 8) +
3988 if (!sas_device
.handle
)
3991 phy_info
= mptsas_refreshing_device_handles(ioc
, &sas_device
);
3995 if (mptsas_get_rphy(phy_info
))
3998 mptsas_add_end_device(ioc
, phy_info
);
4001 case MPTSAS_DEL_DEVICE
:
4002 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4003 hot_plug_info
->sas_address
);
4004 mptsas_del_end_device(ioc
, phy_info
);
4007 case MPTSAS_DEL_PHYSDISK
:
4009 mpt_findImVolumes(ioc
);
4011 phy_info
= mptsas_find_phyinfo_by_phys_disk_num(
4012 ioc
, hot_plug_info
->phys_disk_num
,
4013 hot_plug_info
->channel
,
4015 mptsas_del_end_device(ioc
, phy_info
);
4018 case MPTSAS_ADD_PHYSDISK_REPROBE
:
4020 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4021 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4022 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4023 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4024 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4025 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4026 __func__
, hot_plug_info
->id
, __LINE__
));
4030 phy_info
= mptsas_find_phyinfo_by_sas_address(
4031 ioc
, sas_device
.sas_address
);
4034 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4035 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4036 __func__
, hot_plug_info
->id
, __LINE__
));
4040 starget
= mptsas_get_starget(phy_info
);
4042 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4043 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4044 __func__
, hot_plug_info
->id
, __LINE__
));
4048 vtarget
= starget
->hostdata
;
4050 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4051 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4052 __func__
, hot_plug_info
->id
, __LINE__
));
4056 mpt_findImVolumes(ioc
);
4058 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Hidding: "
4059 "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4060 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4061 hot_plug_info
->phys_disk_num
, (unsigned long long)
4062 sas_device
.sas_address
);
4064 vtarget
->id
= hot_plug_info
->phys_disk_num
;
4065 vtarget
->tflags
|= MPT_TARGET_FLAGS_RAID_COMPONENT
;
4066 phy_info
->attached
.phys_disk_num
= hot_plug_info
->phys_disk_num
;
4067 mptsas_reprobe_target(starget
, 1);
4070 case MPTSAS_DEL_PHYSDISK_REPROBE
:
4072 if (mptsas_sas_device_pg0(ioc
, &sas_device
,
4073 (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
<<
4074 MPI_SAS_DEVICE_PGAD_FORM_SHIFT
),
4075 (hot_plug_info
->channel
<< 8) + hot_plug_info
->id
)) {
4076 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4077 "%s: fw_id=%d exit at line=%d\n",
4078 ioc
->name
, __func__
,
4079 hot_plug_info
->id
, __LINE__
));
4083 phy_info
= mptsas_find_phyinfo_by_sas_address(ioc
,
4084 sas_device
.sas_address
);
4086 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4087 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4088 __func__
, hot_plug_info
->id
, __LINE__
));
4092 starget
= mptsas_get_starget(phy_info
);
4094 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4095 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4096 __func__
, hot_plug_info
->id
, __LINE__
));
4100 vtarget
= starget
->hostdata
;
4102 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4103 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4104 __func__
, hot_plug_info
->id
, __LINE__
));
4108 if (!(vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)) {
4109 dfailprintk(ioc
, printk(MYIOC_s_ERR_FMT
4110 "%s: fw_id=%d exit at line=%d\n", ioc
->name
,
4111 __func__
, hot_plug_info
->id
, __LINE__
));
4115 mpt_findImVolumes(ioc
);
4117 starget_printk(KERN_INFO
, starget
, MYIOC_s_FMT
"RAID Exposing:"
4118 " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4119 ioc
->name
, hot_plug_info
->channel
, hot_plug_info
->id
,
4120 hot_plug_info
->phys_disk_num
, (unsigned long long)
4121 sas_device
.sas_address
);
4123 vtarget
->tflags
&= ~MPT_TARGET_FLAGS_RAID_COMPONENT
;
4124 vtarget
->id
= hot_plug_info
->id
;
4125 phy_info
->attached
.phys_disk_num
= ~0;
4126 mptsas_reprobe_target(starget
, 0);
4127 mptsas_add_device_component_by_fw(ioc
,
4128 hot_plug_info
->channel
, hot_plug_info
->id
);
4131 case MPTSAS_ADD_RAID
:
4133 mpt_findImVolumes(ioc
);
4134 printk(MYIOC_s_INFO_FMT
"attaching raid volume, channel %d, "
4135 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4137 scsi_add_device(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4138 hot_plug_info
->id
, 0);
4141 case MPTSAS_DEL_RAID
:
4143 mpt_findImVolumes(ioc
);
4144 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4145 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
,
4147 scsi_remove_device(hot_plug_info
->sdev
);
4148 scsi_device_put(hot_plug_info
->sdev
);
4151 case MPTSAS_ADD_INACTIVE_VOLUME
:
4153 mpt_findImVolumes(ioc
);
4154 mptsas_adding_inactive_raid_components(ioc
,
4155 hot_plug_info
->channel
, hot_plug_info
->id
);
4162 mptsas_free_fw_event(ioc
, fw_event
);
4166 mptsas_send_sas_event(struct fw_event_work
*fw_event
)
4169 struct mptsas_hotplug_event hot_plug_info
;
4170 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
;
4174 ioc
= fw_event
->ioc
;
4175 sas_event_data
= (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)
4176 fw_event
->event_data
;
4177 device_info
= le32_to_cpu(sas_event_data
->DeviceInfo
);
4180 (MPI_SAS_DEVICE_INFO_SSP_TARGET
|
4181 MPI_SAS_DEVICE_INFO_STP_TARGET
|
4182 MPI_SAS_DEVICE_INFO_SATA_DEVICE
)) == 0) {
4183 mptsas_free_fw_event(ioc
, fw_event
);
4187 if (sas_event_data
->ReasonCode
==
4188 MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
) {
4189 mptbase_sas_persist_operation(ioc
,
4190 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4191 mptsas_free_fw_event(ioc
, fw_event
);
4195 switch (sas_event_data
->ReasonCode
) {
4196 case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
:
4197 case MPI_EVENT_SAS_DEV_STAT_RC_ADDED
:
4198 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4199 hot_plug_info
.handle
= le16_to_cpu(sas_event_data
->DevHandle
);
4200 hot_plug_info
.channel
= sas_event_data
->Bus
;
4201 hot_plug_info
.id
= sas_event_data
->TargetID
;
4202 hot_plug_info
.phy_id
= sas_event_data
->PhyNum
;
4203 memcpy(&sas_address
, &sas_event_data
->SASAddress
,
4205 hot_plug_info
.sas_address
= le64_to_cpu(sas_address
);
4206 hot_plug_info
.device_info
= device_info
;
4207 if (sas_event_data
->ReasonCode
&
4208 MPI_EVENT_SAS_DEV_STAT_RC_ADDED
)
4209 hot_plug_info
.event_type
= MPTSAS_ADD_DEVICE
;
4211 hot_plug_info
.event_type
= MPTSAS_DEL_DEVICE
;
4212 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4215 case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED
:
4216 mptbase_sas_persist_operation(ioc
,
4217 MPI_SAS_OP_CLEAR_NOT_PRESENT
);
4218 mptsas_free_fw_event(ioc
, fw_event
);
4221 case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA
:
4223 case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET
:
4226 mptsas_free_fw_event(ioc
, fw_event
);
4232 mptsas_send_raid_event(struct fw_event_work
*fw_event
)
4235 EVENT_DATA_RAID
*raid_event_data
;
4236 struct mptsas_hotplug_event hot_plug_info
;
4239 struct scsi_device
*sdev
= NULL
;
4240 VirtDevice
*vdevice
= NULL
;
4241 RaidPhysDiskPage0_t phys_disk
;
4243 ioc
= fw_event
->ioc
;
4244 raid_event_data
= (EVENT_DATA_RAID
*)fw_event
->event_data
;
4245 status
= le32_to_cpu(raid_event_data
->SettingsStatus
);
4246 state
= (status
>> 8) & 0xff;
4248 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4249 hot_plug_info
.id
= raid_event_data
->VolumeID
;
4250 hot_plug_info
.channel
= raid_event_data
->VolumeBus
;
4251 hot_plug_info
.phys_disk_num
= raid_event_data
->PhysDiskNum
;
4253 if (raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_DELETED
||
4254 raid_event_data
->ReasonCode
== MPI_EVENT_RAID_RC_VOLUME_CREATED
||
4255 raid_event_data
->ReasonCode
==
4256 MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
) {
4257 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
,
4258 hot_plug_info
.id
, 0);
4259 hot_plug_info
.sdev
= sdev
;
4261 vdevice
= sdev
->hostdata
;
4264 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4265 "ReasonCode=%02x\n", ioc
->name
, __func__
,
4266 raid_event_data
->ReasonCode
));
4268 switch (raid_event_data
->ReasonCode
) {
4269 case MPI_EVENT_RAID_RC_PHYSDISK_DELETED
:
4270 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK_REPROBE
;
4272 case MPI_EVENT_RAID_RC_PHYSDISK_CREATED
:
4273 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK_REPROBE
;
4275 case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED
:
4277 case MPI_PD_STATE_ONLINE
:
4278 case MPI_PD_STATE_NOT_COMPATIBLE
:
4279 mpt_raid_phys_disk_pg0(ioc
,
4280 raid_event_data
->PhysDiskNum
, &phys_disk
);
4281 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4282 hot_plug_info
.channel
= phys_disk
.PhysDiskBus
;
4283 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4285 case MPI_PD_STATE_FAILED
:
4286 case MPI_PD_STATE_MISSING
:
4287 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST
:
4288 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST
:
4289 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON
:
4290 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4296 case MPI_EVENT_RAID_RC_VOLUME_DELETED
:
4299 vdevice
->vtarget
->deleted
= 1; /* block IO */
4300 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4302 case MPI_EVENT_RAID_RC_VOLUME_CREATED
:
4304 scsi_device_put(sdev
);
4307 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4309 case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED
:
4310 if (!(status
& MPI_RAIDVOL0_STATUS_FLAG_ENABLED
)) {
4313 vdevice
->vtarget
->deleted
= 1; /* block IO */
4314 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4318 case MPI_RAIDVOL0_STATUS_STATE_FAILED
:
4319 case MPI_RAIDVOL0_STATUS_STATE_MISSING
:
4322 vdevice
->vtarget
->deleted
= 1; /* block IO */
4323 hot_plug_info
.event_type
= MPTSAS_DEL_RAID
;
4325 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL
:
4326 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED
:
4328 scsi_device_put(sdev
);
4331 hot_plug_info
.event_type
= MPTSAS_ADD_RAID
;
4341 if (hot_plug_info
.event_type
!= MPTSAS_IGNORE_EVENT
)
4342 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4344 mptsas_free_fw_event(ioc
, fw_event
);
4348 * mptsas_issue_tm - send mptsas internal tm request
4349 * @ioc: Pointer to MPT_ADAPTER structure
4350 * @type: Task Management type
4351 * @channel: channel number for task management
4352 * @id: Logical Target ID for reset (if appropriate)
4353 * @lun: Logical unit for reset (if appropriate)
4354 * @task_context: Context for the task to be aborted
4355 * @timeout: timeout for task management control
4357 * return 0 on success and -1 on failure:
4361 mptsas_issue_tm(MPT_ADAPTER
*ioc
, u8 type
, u8 channel
, u8 id
, u64 lun
,
4362 int task_context
, ulong timeout
, u8
*issue_reset
)
4365 SCSITaskMgmt_t
*pScsiTm
;
4367 unsigned long timeleft
;
4370 mf
= mpt_get_msg_frame(mptsasDeviceResetCtx
, ioc
);
4372 retval
= -1; /* return failure */
4373 dtmprintk(ioc
, printk(MYIOC_s_WARN_FMT
"TaskMgmt request: no "
4374 "msg frames!!\n", ioc
->name
));
4378 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"TaskMgmt request: mr = %p, "
4379 "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, "
4380 "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc
->name
, mf
,
4381 type
, timeout
, channel
, id
, (unsigned long long)lun
,
4384 pScsiTm
= (SCSITaskMgmt_t
*) mf
;
4385 memset(pScsiTm
, 0, sizeof(SCSITaskMgmt_t
));
4386 pScsiTm
->Function
= MPI_FUNCTION_SCSI_TASK_MGMT
;
4387 pScsiTm
->TaskType
= type
;
4388 pScsiTm
->MsgFlags
= 0;
4389 pScsiTm
->TargetID
= id
;
4390 pScsiTm
->Bus
= channel
;
4391 pScsiTm
->ChainOffset
= 0;
4392 pScsiTm
->Reserved
= 0;
4393 pScsiTm
->Reserved1
= 0;
4394 pScsiTm
->TaskMsgContext
= task_context
;
4395 int_to_scsilun(lun
, (struct scsi_lun
*)pScsiTm
->LUN
);
4397 INITIALIZE_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4398 CLEAR_MGMT_STATUS(ioc
->internal_cmds
.status
)
4400 mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx
, ioc
, mf
);
4402 /* Now wait for the command to complete */
4403 timeleft
= wait_for_completion_timeout(&ioc
->taskmgmt_cmds
.done
,
4405 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_COMMAND_GOOD
)) {
4406 retval
= -1; /* return failure */
4407 dtmprintk(ioc
, printk(MYIOC_s_ERR_FMT
4408 "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc
->name
, mf
));
4409 mpt_free_msg_frame(ioc
, mf
);
4410 if (ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_DID_IOCRESET
)
4416 if (!(ioc
->taskmgmt_cmds
.status
& MPT_MGMT_STATUS_RF_VALID
)) {
4417 retval
= -1; /* return failure */
4418 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4419 "TaskMgmt request: failed with no reply\n", ioc
->name
));
4424 CLEAR_MGMT_STATUS(ioc
->taskmgmt_cmds
.status
)
4429 * mptsas_broadcast_primative_work - Handle broadcast primitives
4430 * @work: work queue payload containing info describing the event
4432 * this will be handled in workqueue context.
4435 mptsas_broadcast_primative_work(struct fw_event_work
*fw_event
)
4437 MPT_ADAPTER
*ioc
= fw_event
->ioc
;
4439 VirtDevice
*vdevice
;
4441 struct scsi_cmnd
*sc
;
4442 SCSITaskMgmtReply_t
*pScsiTmReply
;
4447 u32 termination_count
;
4450 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4451 "%s - enter\n", ioc
->name
, __func__
));
4453 mutex_lock(&ioc
->taskmgmt_cmds
.mutex
);
4454 if (mpt_set_taskmgmt_in_progress_flag(ioc
) != 0) {
4455 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4456 mptsas_requeue_fw_event(ioc
, fw_event
, 1000);
4461 termination_count
= 0;
4463 mpt_findImVolumes(ioc
);
4464 pScsiTmReply
= (SCSITaskMgmtReply_t
*) ioc
->taskmgmt_cmds
.reply
;
4466 for (ii
= 0; ii
< ioc
->req_depth
; ii
++) {
4467 if (ioc
->fw_events_off
)
4469 sc
= mptscsih_get_scsi_lookup(ioc
, ii
);
4472 mf
= MPT_INDEX_2_MFPTR(ioc
, ii
);
4475 task_context
= mf
->u
.frame
.hwhdr
.msgctxu
.MsgContext
;
4476 vdevice
= sc
->device
->hostdata
;
4477 if (!vdevice
|| !vdevice
->vtarget
)
4479 if (vdevice
->vtarget
->tflags
& MPT_TARGET_FLAGS_RAID_COMPONENT
)
4480 continue; /* skip hidden raid components */
4481 if (vdevice
->vtarget
->raidVolume
)
4482 continue; /* skip hidden raid components */
4483 channel
= vdevice
->vtarget
->channel
;
4484 id
= vdevice
->vtarget
->id
;
4486 if (mptsas_issue_tm(ioc
, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK
,
4487 channel
, id
, (u64
)lun
, task_context
, 30, &issue_reset
))
4490 termination_count
+=
4491 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4492 if ((pScsiTmReply
->IOCStatus
== MPI_IOCSTATUS_SUCCESS
) &&
4493 (pScsiTmReply
->ResponseCode
==
4494 MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED
||
4495 pScsiTmReply
->ResponseCode
==
4496 MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC
))
4498 if (mptsas_issue_tm(ioc
,
4499 MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET
,
4500 channel
, id
, (u64
)lun
, 0, 30, &issue_reset
))
4502 termination_count
+=
4503 le32_to_cpu(pScsiTmReply
->TerminationCount
);
4507 dtmprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4508 "%s - exit, query_count = %d termination_count = %d\n",
4509 ioc
->name
, __func__
, query_count
, termination_count
));
4511 ioc
->broadcast_aen_busy
= 0;
4512 mpt_clear_taskmgmt_in_progress_flag(ioc
);
4513 mutex_unlock(&ioc
->taskmgmt_cmds
.mutex
);
4516 printk(MYIOC_s_WARN_FMT
"Issuing Reset from %s!!\n",
4517 ioc
->name
, __func__
);
4518 mpt_HardResetHandler(ioc
, CAN_SLEEP
);
4520 mptsas_free_fw_event(ioc
, fw_event
);
4524 * mptsas_send_ir2_event - handle exposing hidden disk when
4525 * an inactive raid volume is added
4527 * @ioc: Pointer to MPT_ADAPTER structure
4532 mptsas_send_ir2_event(struct fw_event_work
*fw_event
)
4535 struct mptsas_hotplug_event hot_plug_info
;
4536 MPI_EVENT_DATA_IR2
*ir2_data
;
4538 RaidPhysDiskPage0_t phys_disk
;
4540 ioc
= fw_event
->ioc
;
4541 ir2_data
= (MPI_EVENT_DATA_IR2
*)fw_event
->event_data
;
4542 reasonCode
= ir2_data
->ReasonCode
;
4544 devtprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"Entering %s: "
4545 "ReasonCode=%02x\n", ioc
->name
, __func__
, reasonCode
));
4547 memset(&hot_plug_info
, 0, sizeof(struct mptsas_hotplug_event
));
4548 hot_plug_info
.id
= ir2_data
->TargetID
;
4549 hot_plug_info
.channel
= ir2_data
->Bus
;
4550 switch (reasonCode
) {
4551 case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED
:
4552 hot_plug_info
.event_type
= MPTSAS_ADD_INACTIVE_VOLUME
;
4554 case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED
:
4555 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4556 hot_plug_info
.event_type
= MPTSAS_DEL_PHYSDISK
;
4558 case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED
:
4559 hot_plug_info
.phys_disk_num
= ir2_data
->PhysDiskNum
;
4560 mpt_raid_phys_disk_pg0(ioc
,
4561 ir2_data
->PhysDiskNum
, &phys_disk
);
4562 hot_plug_info
.id
= phys_disk
.PhysDiskID
;
4563 hot_plug_info
.event_type
= MPTSAS_ADD_PHYSDISK
;
4566 mptsas_free_fw_event(ioc
, fw_event
);
4569 mptsas_hotplug_work(ioc
, fw_event
, &hot_plug_info
);
4573 mptsas_event_process(MPT_ADAPTER
*ioc
, EventNotificationReply_t
*reply
)
4575 u32 event
= le32_to_cpu(reply
->Event
);
4576 int sz
, event_data_sz
;
4577 struct fw_event_work
*fw_event
;
4578 unsigned long delay
;
4580 /* events turned off due to host reset or driver unloading */
4581 if (ioc
->fw_events_off
)
4584 delay
= msecs_to_jiffies(1);
4586 case MPI_EVENT_SAS_BROADCAST_PRIMITIVE
:
4588 EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*broadcast_event_data
=
4589 (EVENT_DATA_SAS_BROADCAST_PRIMITIVE
*)reply
->Data
;
4590 if (broadcast_event_data
->Primitive
!=
4591 MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT
)
4593 if (ioc
->broadcast_aen_busy
)
4595 ioc
->broadcast_aen_busy
= 1;
4598 case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE
:
4600 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*sas_event_data
=
4601 (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
*)reply
->Data
;
4603 if (sas_event_data
->ReasonCode
==
4604 MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING
) {
4605 mptsas_target_reset_queue(ioc
, sas_event_data
);
4610 case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE
:
4612 MpiEventDataSasExpanderStatusChange_t
*expander_data
=
4613 (MpiEventDataSasExpanderStatusChange_t
*)reply
->Data
;
4615 if (ioc
->old_sas_discovery_protocal
)
4618 if (expander_data
->ReasonCode
==
4619 MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING
&&
4620 ioc
->device_missing_delay
)
4621 delay
= HZ
* ioc
->device_missing_delay
;
4624 case MPI_EVENT_SAS_DISCOVERY
:
4626 u32 discovery_status
;
4627 EventDataSasDiscovery_t
*discovery_data
=
4628 (EventDataSasDiscovery_t
*)reply
->Data
;
4630 discovery_status
= le32_to_cpu(discovery_data
->DiscoveryStatus
);
4631 ioc
->sas_discovery_quiesce_io
= discovery_status
? 1 : 0;
4632 if (ioc
->old_sas_discovery_protocal
&& !discovery_status
)
4633 mptsas_queue_rescan(ioc
);
4636 case MPI_EVENT_INTEGRATED_RAID
:
4637 case MPI_EVENT_PERSISTENT_TABLE_FULL
:
4639 case MPI_EVENT_SAS_PHY_LINK_STATUS
:
4640 case MPI_EVENT_QUEUE_FULL
:
4646 event_data_sz
= ((reply
->MsgLength
* 4) -
4647 offsetof(EventNotificationReply_t
, Data
));
4648 sz
= offsetof(struct fw_event_work
, event_data
) + event_data_sz
;
4649 fw_event
= kzalloc(sz
, GFP_ATOMIC
);
4651 printk(MYIOC_s_WARN_FMT
"%s: failed at (line=%d)\n", ioc
->name
,
4652 __func__
, __LINE__
);
4655 memcpy(fw_event
->event_data
, reply
->Data
, event_data_sz
);
4656 fw_event
->event
= event
;
4657 fw_event
->ioc
= ioc
;
4658 mptsas_add_fw_event(ioc
, fw_event
, delay
);
4662 /* Delete a volume when no longer listed in ioc pg2
4664 static void mptsas_volume_delete(MPT_ADAPTER
*ioc
, u8 id
)
4666 struct scsi_device
*sdev
;
4669 sdev
= scsi_device_lookup(ioc
->sh
, MPTSAS_RAID_CHANNEL
, id
, 0);
4672 if (!ioc
->raid_data
.pIocPg2
)
4674 if (!ioc
->raid_data
.pIocPg2
->NumActiveVolumes
)
4676 for (i
= 0; i
< ioc
->raid_data
.pIocPg2
->NumActiveVolumes
; i
++)
4677 if (ioc
->raid_data
.pIocPg2
->RaidVolume
[i
].VolumeID
== id
)
4680 printk(MYIOC_s_INFO_FMT
"removing raid volume, channel %d, "
4681 "id %d\n", ioc
->name
, MPTSAS_RAID_CHANNEL
, id
);
4682 scsi_remove_device(sdev
);
4684 scsi_device_put(sdev
);
4688 mptsas_probe(struct pci_dev
*pdev
, const struct pci_device_id
*id
)
4690 struct Scsi_Host
*sh
;
4693 unsigned long flags
;
4701 r
= mpt_attach(pdev
,id
);
4705 ioc
= pci_get_drvdata(pdev
);
4706 mptsas_fw_event_off(ioc
);
4707 ioc
->DoneCtx
= mptsasDoneCtx
;
4708 ioc
->TaskCtx
= mptsasTaskCtx
;
4709 ioc
->InternalCtx
= mptsasInternalCtx
;
4711 /* Added sanity check on readiness of the MPT adapter.
4713 if (ioc
->last_state
!= MPI_IOC_STATE_OPERATIONAL
) {
4714 printk(MYIOC_s_WARN_FMT
4715 "Skipping because it's not operational!\n",
4718 goto out_mptsas_probe
;
4722 printk(MYIOC_s_WARN_FMT
"Skipping because it's disabled!\n",
4725 goto out_mptsas_probe
;
4728 /* Sanity check - ensure at least 1 port is INITIATOR capable
4731 for (ii
= 0; ii
< ioc
->facts
.NumberOfPorts
; ii
++) {
4732 if (ioc
->pfacts
[ii
].ProtocolFlags
&
4733 MPI_PORTFACTS_PROTOCOL_INITIATOR
)
4738 printk(MYIOC_s_WARN_FMT
4739 "Skipping ioc=%p because SCSI Initiator mode "
4740 "is NOT enabled!\n", ioc
->name
, ioc
);
4744 sh
= scsi_host_alloc(&mptsas_driver_template
, sizeof(MPT_SCSI_HOST
));
4746 printk(MYIOC_s_WARN_FMT
4747 "Unable to register controller with SCSI subsystem\n",
4750 goto out_mptsas_probe
;
4753 spin_lock_irqsave(&ioc
->FreeQlock
, flags
);
4755 /* Attach the SCSI Host to the IOC structure
4763 /* set 16 byte cdb's */
4764 sh
->max_cmd_len
= 16;
4765 sh
->can_queue
= min_t(int, ioc
->req_depth
- 10, sh
->can_queue
);
4767 sh
->max_lun
= max_lun
;
4768 sh
->transportt
= mptsas_transport_template
;
4772 sh
->unique_id
= ioc
->id
;
4774 INIT_LIST_HEAD(&ioc
->sas_topology
);
4775 mutex_init(&ioc
->sas_topology_mutex
);
4776 mutex_init(&ioc
->sas_discovery_mutex
);
4777 mutex_init(&ioc
->sas_mgmt
.mutex
);
4778 init_completion(&ioc
->sas_mgmt
.done
);
4780 /* Verify that we won't exceed the maximum
4781 * number of chain buffers
4782 * We can optimize: ZZ = req_sz/sizeof(SGE)
4784 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
4785 * + (req_sz - 64)/sizeof(SGE)
4786 * A slightly different algorithm is required for
4789 scale
= ioc
->req_sz
/ioc
->SGE_size
;
4790 if (ioc
->sg_addr_size
== sizeof(u64
)) {
4791 numSGE
= (scale
- 1) *
4792 (ioc
->facts
.MaxChainDepth
-1) + scale
+
4793 (ioc
->req_sz
- 60) / ioc
->SGE_size
;
4795 numSGE
= 1 + (scale
- 1) *
4796 (ioc
->facts
.MaxChainDepth
-1) + scale
+
4797 (ioc
->req_sz
- 64) / ioc
->SGE_size
;
4800 if (numSGE
< sh
->sg_tablesize
) {
4801 /* Reset this value */
4802 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
4803 "Resetting sg_tablesize to %d from %d\n",
4804 ioc
->name
, numSGE
, sh
->sg_tablesize
));
4805 sh
->sg_tablesize
= numSGE
;
4808 hd
= shost_priv(sh
);
4811 /* SCSI needs scsi_cmnd lookup table!
4812 * (with size equal to req_depth*PtrSz!)
4814 ioc
->ScsiLookup
= kcalloc(ioc
->req_depth
, sizeof(void *), GFP_ATOMIC
);
4815 if (!ioc
->ScsiLookup
) {
4817 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
4818 goto out_mptsas_probe
;
4820 spin_lock_init(&ioc
->scsi_lookup_lock
);
4822 dprintk(ioc
, printk(MYIOC_s_DEBUG_FMT
"ScsiLookup @ %p\n",
4823 ioc
->name
, ioc
->ScsiLookup
));
4825 ioc
->sas_data
.ptClear
= mpt_pt_clear
;
4827 hd
->last_queue_full
= 0;
4828 INIT_LIST_HEAD(&hd
->target_reset_list
);
4829 INIT_LIST_HEAD(&ioc
->sas_device_info_list
);
4830 mutex_init(&ioc
->sas_device_info_mutex
);
4832 spin_unlock_irqrestore(&ioc
->FreeQlock
, flags
);
4834 if (ioc
->sas_data
.ptClear
==1) {
4835 mptbase_sas_persist_operation(
4836 ioc
, MPI_SAS_OP_CLEAR_ALL_PERSISTENT
);
4839 error
= scsi_add_host(sh
, &ioc
->pcidev
->dev
);
4841 dprintk(ioc
, printk(MYIOC_s_ERR_FMT
4842 "scsi_add_host failed\n", ioc
->name
));
4843 goto out_mptsas_probe
;
4846 /* older firmware doesn't support expander events */
4847 if ((ioc
->facts
.HeaderVersion
>> 8) < 0xE)
4848 ioc
->old_sas_discovery_protocal
= 1;
4849 mptsas_scan_sas_topology(ioc
);
4850 mptsas_fw_event_on(ioc
);
4855 mptscsih_remove(pdev
);
4860 mptsas_shutdown(struct pci_dev
*pdev
)
4862 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
4864 mptsas_fw_event_off(ioc
);
4865 mptsas_cleanup_fw_event_q(ioc
);
4868 static void __devexit
mptsas_remove(struct pci_dev
*pdev
)
4870 MPT_ADAPTER
*ioc
= pci_get_drvdata(pdev
);
4871 struct mptsas_portinfo
*p
, *n
;
4874 mptsas_shutdown(pdev
);
4876 mptsas_del_device_components(ioc
);
4878 ioc
->sas_discovery_ignore_events
= 1;
4879 sas_remove_host(ioc
->sh
);
4881 mutex_lock(&ioc
->sas_topology_mutex
);
4882 list_for_each_entry_safe(p
, n
, &ioc
->sas_topology
, list
) {
4884 for (i
= 0 ; i
< p
->num_phys
; i
++)
4885 mptsas_port_delete(ioc
, p
->phy_info
[i
].port_details
);
4890 mutex_unlock(&ioc
->sas_topology_mutex
);
4891 ioc
->hba_port_info
= NULL
;
4892 mptscsih_remove(pdev
);
4895 static struct pci_device_id mptsas_pci_table
[] = {
4896 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064
,
4897 PCI_ANY_ID
, PCI_ANY_ID
},
4898 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068
,
4899 PCI_ANY_ID
, PCI_ANY_ID
},
4900 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1064E
,
4901 PCI_ANY_ID
, PCI_ANY_ID
},
4902 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1068E
,
4903 PCI_ANY_ID
, PCI_ANY_ID
},
4904 { PCI_VENDOR_ID_LSI_LOGIC
, MPI_MANUFACTPAGE_DEVID_SAS1078
,
4905 PCI_ANY_ID
, PCI_ANY_ID
},
4906 {0} /* Terminating entry */
4908 MODULE_DEVICE_TABLE(pci
, mptsas_pci_table
);
4911 static struct pci_driver mptsas_driver
= {
4913 .id_table
= mptsas_pci_table
,
4914 .probe
= mptsas_probe
,
4915 .remove
= __devexit_p(mptsas_remove
),
4916 .shutdown
= mptsas_shutdown
,
4918 .suspend
= mptscsih_suspend
,
4919 .resume
= mptscsih_resume
,
4928 show_mptmod_ver(my_NAME
, my_VERSION
);
4930 mptsas_transport_template
=
4931 sas_attach_transport(&mptsas_transport_functions
);
4932 if (!mptsas_transport_template
)
4935 mptsasDoneCtx
= mpt_register(mptscsih_io_done
, MPTSAS_DRIVER
);
4936 mptsasTaskCtx
= mpt_register(mptscsih_taskmgmt_complete
, MPTSAS_DRIVER
);
4938 mpt_register(mptscsih_scandv_complete
, MPTSAS_DRIVER
);
4939 mptsasMgmtCtx
= mpt_register(mptsas_mgmt_done
, MPTSAS_DRIVER
);
4940 mptsasDeviceResetCtx
=
4941 mpt_register(mptsas_taskmgmt_complete
, MPTSAS_DRIVER
);
4943 mpt_event_register(mptsasDoneCtx
, mptsas_event_process
);
4944 mpt_reset_register(mptsasDoneCtx
, mptsas_ioc_reset
);
4946 error
= pci_register_driver(&mptsas_driver
);
4948 sas_release_transport(mptsas_transport_template
);
4956 pci_unregister_driver(&mptsas_driver
);
4957 sas_release_transport(mptsas_transport_template
);
4959 mpt_reset_deregister(mptsasDoneCtx
);
4960 mpt_event_deregister(mptsasDoneCtx
);
4962 mpt_deregister(mptsasMgmtCtx
);
4963 mpt_deregister(mptsasInternalCtx
);
4964 mpt_deregister(mptsasTaskCtx
);
4965 mpt_deregister(mptsasDoneCtx
);
4966 mpt_deregister(mptsasDeviceResetCtx
);
4969 module_init(mptsas_init
);
4970 module_exit(mptsas_exit
);