diff options
Diffstat (limited to 'drivers/scsi/mpt2sas')
-rw-r--r-- | drivers/scsi/mpt2sas/Kconfig | 1 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2.h | 16 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h | 25 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2_history.txt | 93 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2_init.h | 24 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2_ioc.h | 77 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpi/mpi2_sas.h | 6 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 18 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.h | 14 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_config.c | 51 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_ctl.c | 13 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 266 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_transport.c | 196 |
13 files changed, 697 insertions, 103 deletions
diff --git a/drivers/scsi/mpt2sas/Kconfig b/drivers/scsi/mpt2sas/Kconfig index 70c4c2467dd8..ba8e128de238 100644 --- a/drivers/scsi/mpt2sas/Kconfig +++ b/drivers/scsi/mpt2sas/Kconfig | |||
@@ -44,6 +44,7 @@ config SCSI_MPT2SAS | |||
44 | tristate "LSI MPT Fusion SAS 2.0 Device Driver" | 44 | tristate "LSI MPT Fusion SAS 2.0 Device Driver" |
45 | depends on PCI && SCSI | 45 | depends on PCI && SCSI |
46 | select SCSI_SAS_ATTRS | 46 | select SCSI_SAS_ATTRS |
47 | select RAID_ATTRS | ||
47 | ---help--- | 48 | ---help--- |
48 | This driver supports PCI-Express SAS 6Gb/s Host Adapters. | 49 | This driver supports PCI-Express SAS 6Gb/s Host Adapters. |
49 | 50 | ||
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2.h b/drivers/scsi/mpt2sas/mpi/mpi2.h index 914168105297..9958d847a88d 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2.h | |||
@@ -8,7 +8,7 @@ | |||
8 | * scatter/gather formats. | 8 | * scatter/gather formats. |
9 | * Creation Date: June 21, 2006 | 9 | * Creation Date: June 21, 2006 |
10 | * | 10 | * |
11 | * mpi2.h Version: 02.00.13 | 11 | * mpi2.h Version: 02.00.14 |
12 | * | 12 | * |
13 | * Version History | 13 | * Version History |
14 | * --------------- | 14 | * --------------- |
@@ -53,6 +53,10 @@ | |||
53 | * bytes reserved. | 53 | * bytes reserved. |
54 | * Added RAID Accelerator functionality. | 54 | * Added RAID Accelerator functionality. |
55 | * 07-30-09 02.00.13 Bumped MPI2_HEADER_VERSION_UNIT. | 55 | * 07-30-09 02.00.13 Bumped MPI2_HEADER_VERSION_UNIT. |
56 | * 10-28-09 02.00.14 Bumped MPI2_HEADER_VERSION_UNIT. | ||
57 | * Added MSI-x index mask and shift for Reply Post Host | ||
58 | * Index register. | ||
59 | * Added function code for Host Based Discovery Action. | ||
56 | * -------------------------------------------------------------------------- | 60 | * -------------------------------------------------------------------------- |
57 | */ | 61 | */ |
58 | 62 | ||
@@ -78,7 +82,7 @@ | |||
78 | #define MPI2_VERSION_02_00 (0x0200) | 82 | #define MPI2_VERSION_02_00 (0x0200) |
79 | 83 | ||
80 | /* versioning for this MPI header set */ | 84 | /* versioning for this MPI header set */ |
81 | #define MPI2_HEADER_VERSION_UNIT (0x0D) | 85 | #define MPI2_HEADER_VERSION_UNIT (0x0E) |
82 | #define MPI2_HEADER_VERSION_DEV (0x00) | 86 | #define MPI2_HEADER_VERSION_DEV (0x00) |
83 | #define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00) | 87 | #define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00) |
84 | #define MPI2_HEADER_VERSION_UNIT_SHIFT (8) | 88 | #define MPI2_HEADER_VERSION_UNIT_SHIFT (8) |
@@ -232,9 +236,12 @@ typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS | |||
232 | #define MPI2_REPLY_FREE_HOST_INDEX_OFFSET (0x00000048) | 236 | #define MPI2_REPLY_FREE_HOST_INDEX_OFFSET (0x00000048) |
233 | 237 | ||
234 | /* | 238 | /* |
235 | * Offset for the Reply Descriptor Post Queue | 239 | * Defines for the Reply Descriptor Post Queue |
236 | */ | 240 | */ |
237 | #define MPI2_REPLY_POST_HOST_INDEX_OFFSET (0x0000006C) | 241 | #define MPI2_REPLY_POST_HOST_INDEX_OFFSET (0x0000006C) |
242 | #define MPI2_REPLY_POST_HOST_INDEX_MASK (0x00FFFFFF) | ||
243 | #define MPI2_RPHI_MSIX_INDEX_MASK (0xFF000000) | ||
244 | #define MPI2_RPHI_MSIX_INDEX_SHIFT (24) | ||
238 | 245 | ||
239 | /* | 246 | /* |
240 | * Defines for the HCBSize and address | 247 | * Defines for the HCBSize and address |
@@ -497,12 +504,13 @@ typedef union _MPI2_REPLY_DESCRIPTORS_UNION | |||
497 | #define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) /* Target Command Buffer Post Base */ | 504 | #define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) /* Target Command Buffer Post Base */ |
498 | #define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */ | 505 | #define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */ |
499 | #define MPI2_FUNCTION_RAID_ACCELERATOR (0x2C) /* RAID Accelerator*/ | 506 | #define MPI2_FUNCTION_RAID_ACCELERATOR (0x2C) /* RAID Accelerator*/ |
507 | /* Host Based Discovery Action */ | ||
508 | #define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION (0x2F) | ||
500 | 509 | ||
501 | 510 | ||
502 | 511 | ||
503 | /* Doorbell functions */ | 512 | /* Doorbell functions */ |
504 | #define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) | 513 | #define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) |
505 | /* #define MPI2_FUNCTION_IO_UNIT_RESET (0x41) */ | ||
506 | #define MPI2_FUNCTION_HANDSHAKE (0x42) | 514 | #define MPI2_FUNCTION_HANDSHAKE (0x42) |
507 | 515 | ||
508 | 516 | ||
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h b/drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h index 1611c57a6fdf..cf0ac9f40c97 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Title: MPI Configuration messages and pages | 6 | * Title: MPI Configuration messages and pages |
7 | * Creation Date: November 10, 2006 | 7 | * Creation Date: November 10, 2006 |
8 | * | 8 | * |
9 | * mpi2_cnfg.h Version: 02.00.12 | 9 | * mpi2_cnfg.h Version: 02.00.13 |
10 | * | 10 | * |
11 | * Version History | 11 | * Version History |
12 | * --------------- | 12 | * --------------- |
@@ -107,6 +107,8 @@ | |||
107 | * to SAS Device Page 0 Flags field. | 107 | * to SAS Device Page 0 Flags field. |
108 | * Added PhyInfo defines for power condition. | 108 | * Added PhyInfo defines for power condition. |
109 | * Added Ethernet configuration pages. | 109 | * Added Ethernet configuration pages. |
110 | * 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY. | ||
111 | * Added SAS PHY Page 4 structure and defines. | ||
110 | * -------------------------------------------------------------------------- | 112 | * -------------------------------------------------------------------------- |
111 | */ | 113 | */ |
112 | 114 | ||
@@ -712,6 +714,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_1 | |||
712 | #define MPI2_IOUNITPAGE1_PAGEVERSION (0x04) | 714 | #define MPI2_IOUNITPAGE1_PAGEVERSION (0x04) |
713 | 715 | ||
714 | /* IO Unit Page 1 Flags defines */ | 716 | /* IO Unit Page 1 Flags defines */ |
717 | #define MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY (0x00000800) | ||
715 | #define MPI2_IOUNITPAGE1_MASK_SATA_WRITE_CACHE (0x00000600) | 718 | #define MPI2_IOUNITPAGE1_MASK_SATA_WRITE_CACHE (0x00000600) |
716 | #define MPI2_IOUNITPAGE1_ENABLE_SATA_WRITE_CACHE (0x00000000) | 719 | #define MPI2_IOUNITPAGE1_ENABLE_SATA_WRITE_CACHE (0x00000000) |
717 | #define MPI2_IOUNITPAGE1_DISABLE_SATA_WRITE_CACHE (0x00000200) | 720 | #define MPI2_IOUNITPAGE1_DISABLE_SATA_WRITE_CACHE (0x00000200) |
@@ -2291,6 +2294,26 @@ typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_3 { | |||
2291 | #define MPI2_SASPHY3_PAGEVERSION (0x00) | 2294 | #define MPI2_SASPHY3_PAGEVERSION (0x00) |
2292 | 2295 | ||
2293 | 2296 | ||
2297 | /* SAS PHY Page 4 */ | ||
2298 | |||
2299 | typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_4 { | ||
2300 | MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ | ||
2301 | U16 Reserved1; /* 0x08 */ | ||
2302 | U8 Reserved2; /* 0x0A */ | ||
2303 | U8 Flags; /* 0x0B */ | ||
2304 | U8 InitialFrame[28]; /* 0x0C */ | ||
2305 | } MPI2_CONFIG_PAGE_SAS_PHY_4, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_4, | ||
2306 | Mpi2SasPhyPage4_t, MPI2_POINTER pMpi2SasPhyPage4_t; | ||
2307 | |||
2308 | #define MPI2_SASPHY4_PAGEVERSION (0x00) | ||
2309 | |||
2310 | /* values for the Flags field */ | ||
2311 | #define MPI2_SASPHY4_FLAGS_FRAME_VALID (0x02) | ||
2312 | #define MPI2_SASPHY4_FLAGS_SATA_FRAME (0x01) | ||
2313 | |||
2314 | |||
2315 | |||
2316 | |||
2294 | /**************************************************************************** | 2317 | /**************************************************************************** |
2295 | * SAS Port Config Pages | 2318 | * SAS Port Config Pages |
2296 | ****************************************************************************/ | 2319 | ****************************************************************************/ |
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_history.txt b/drivers/scsi/mpt2sas/mpi/mpi2_history.txt index 65fcaa31cb30..c4adf76b49d9 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_history.txt +++ b/drivers/scsi/mpt2sas/mpi/mpi2_history.txt | |||
@@ -5,23 +5,24 @@ | |||
5 | Copyright (c) 2000-2009 LSI Corporation. | 5 | Copyright (c) 2000-2009 LSI Corporation. |
6 | 6 | ||
7 | --------------------------------------- | 7 | --------------------------------------- |
8 | Header Set Release Version: 02.00.12 | 8 | Header Set Release Version: 02.00.14 |
9 | Header Set Release Date: 05-06-09 | 9 | Header Set Release Date: 10-28-09 |
10 | --------------------------------------- | 10 | --------------------------------------- |
11 | 11 | ||
12 | Filename Current version Prior version | 12 | Filename Current version Prior version |
13 | ---------- --------------- ------------- | 13 | ---------- --------------- ------------- |
14 | mpi2.h 02.00.12 02.00.11 | 14 | mpi2.h 02.00.14 02.00.13 |
15 | mpi2_cnfg.h 02.00.11 02.00.10 | 15 | mpi2_cnfg.h 02.00.13 02.00.12 |
16 | mpi2_init.h 02.00.07 02.00.06 | 16 | mpi2_init.h 02.00.08 02.00.07 |
17 | mpi2_ioc.h 02.00.11 02.00.10 | 17 | mpi2_ioc.h 02.00.13 02.00.12 |
18 | mpi2_raid.h 02.00.03 02.00.03 | 18 | mpi2_raid.h 02.00.04 02.00.04 |
19 | mpi2_sas.h 02.00.02 02.00.02 | 19 | mpi2_sas.h 02.00.03 02.00.02 |
20 | mpi2_targ.h 02.00.03 02.00.03 | 20 | mpi2_targ.h 02.00.03 02.00.03 |
21 | mpi2_tool.h 02.00.03 02.00.02 | 21 | mpi2_tool.h 02.00.04 02.00.04 |
22 | mpi2_type.h 02.00.00 02.00.00 | 22 | mpi2_type.h 02.00.00 02.00.00 |
23 | mpi2_ra.h 02.00.00 | 23 | mpi2_ra.h 02.00.00 02.00.00 |
24 | mpi2_history.txt 02.00.11 02.00.12 | 24 | mpi2_hbd.h 02.00.00 |
25 | mpi2_history.txt 02.00.14 02.00.13 | ||
25 | 26 | ||
26 | 27 | ||
27 | * Date Version Description | 28 | * Date Version Description |
@@ -65,6 +66,11 @@ mpi2.h | |||
65 | * MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR and made those | 66 | * MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR and made those |
66 | * bytes reserved. | 67 | * bytes reserved. |
67 | * Added RAID Accelerator functionality. | 68 | * Added RAID Accelerator functionality. |
69 | * 07-30-09 02.00.13 Bumped MPI2_HEADER_VERSION_UNIT. | ||
70 | * 10-28-09 02.00.14 Bumped MPI2_HEADER_VERSION_UNIT. | ||
71 | * Added MSI-x index mask and shift for Reply Post Host | ||
72 | * Index register. | ||
73 | * Added function code for Host Based Discovery Action. | ||
68 | * -------------------------------------------------------------------------- | 74 | * -------------------------------------------------------------------------- |
69 | 75 | ||
70 | mpi2_cnfg.h | 76 | mpi2_cnfg.h |
@@ -155,6 +161,15 @@ mpi2_cnfg.h | |||
155 | * Added expander reduced functionality data to SAS | 161 | * Added expander reduced functionality data to SAS |
156 | * Expander Page 0. | 162 | * Expander Page 0. |
157 | * Added SAS PHY Page 2 and SAS PHY Page 3. | 163 | * Added SAS PHY Page 2 and SAS PHY Page 3. |
164 | * 07-30-09 02.00.12 Added IO Unit Page 7. | ||
165 | * Added new device ids. | ||
166 | * Added SAS IO Unit Page 5. | ||
167 | * Added partial and slumber power management capable flags | ||
168 | * to SAS Device Page 0 Flags field. | ||
169 | * Added PhyInfo defines for power condition. | ||
170 | * Added Ethernet configuration pages. | ||
171 | * 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY. | ||
172 | * Added SAS PHY Page 4 structure and defines. | ||
158 | * -------------------------------------------------------------------------- | 173 | * -------------------------------------------------------------------------- |
159 | 174 | ||
160 | mpi2_init.h | 175 | mpi2_init.h |
@@ -172,6 +187,10 @@ mpi2_init.h | |||
172 | * Query Asynchronous Event. | 187 | * Query Asynchronous Event. |
173 | * Defined two new bits in the SlotStatus field of the SCSI | 188 | * Defined two new bits in the SlotStatus field of the SCSI |
174 | * Enclosure Processor Request and Reply. | 189 | * Enclosure Processor Request and Reply. |
190 | * 10-28-09 02.00.08 Added defines for decoding the ResponseInfo bytes for | ||
191 | * both SCSI IO Error Reply and SCSI Task Management Reply. | ||
192 | * Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY. | ||
193 | * Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define. | ||
175 | * -------------------------------------------------------------------------- | 194 | * -------------------------------------------------------------------------- |
176 | 195 | ||
177 | mpi2_ioc.h | 196 | mpi2_ioc.h |
@@ -246,6 +265,20 @@ mpi2_ioc.h | |||
246 | * Added two new reason codes for SAS Device Status Change | 265 | * Added two new reason codes for SAS Device Status Change |
247 | * Event. | 266 | * Event. |
248 | * Added new event: SAS PHY Counter. | 267 | * Added new event: SAS PHY Counter. |
268 | * 07-30-09 02.00.12 Added GPIO Interrupt event define and structure. | ||
269 | * Added MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. | ||
270 | * Added new product id family for 2208. | ||
271 | * 10-28-09 02.00.13 Added HostMSIxVectors field to MPI2_IOC_INIT_REQUEST. | ||
272 | * Added MaxMSIxVectors field to MPI2_IOC_FACTS_REPLY. | ||
273 | * Added MinDevHandle field to MPI2_IOC_FACTS_REPLY. | ||
274 | * Added MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY. | ||
275 | * Added MPI2_EVENT_HOST_BASED_DISCOVERY_PHY define. | ||
276 | * Added MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER define. | ||
277 | * Added Host Based Discovery Phy Event data. | ||
278 | * Added defines for ProductID Product field | ||
279 | * (MPI2_FW_HEADER_PID_). | ||
280 | * Modified values for SAS ProductID Family | ||
281 | * (MPI2_FW_HEADER_PID_FAMILY_). | ||
249 | * -------------------------------------------------------------------------- | 282 | * -------------------------------------------------------------------------- |
250 | 283 | ||
251 | mpi2_raid.h | 284 | mpi2_raid.h |
@@ -256,6 +289,8 @@ mpi2_raid.h | |||
256 | * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that | 289 | * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that |
257 | * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT | 290 | * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT |
258 | * can be sized by the build environment. | 291 | * can be sized by the build environment. |
292 | * 07-30-09 02.00.04 Added proper define for the Use Default Settings bit of | ||
293 | * VolumeCreationFlags and marked the old one as obsolete. | ||
259 | * -------------------------------------------------------------------------- | 294 | * -------------------------------------------------------------------------- |
260 | 295 | ||
261 | mpi2_sas.h | 296 | mpi2_sas.h |
@@ -264,6 +299,8 @@ mpi2_sas.h | |||
264 | * Control Request. | 299 | * Control Request. |
265 | * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control | 300 | * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control |
266 | * Request. | 301 | * Request. |
302 | * 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST | ||
303 | * to MPI2_SGE_IO_UNION since it supports chained SGLs. | ||
267 | * -------------------------------------------------------------------------- | 304 | * -------------------------------------------------------------------------- |
268 | 305 | ||
269 | mpi2_targ.h | 306 | mpi2_targ.h |
@@ -283,6 +320,10 @@ mpi2_tool.h | |||
283 | * structures and defines. | 320 | * structures and defines. |
284 | * 02-29-08 02.00.02 Modified various names to make them 32-character unique. | 321 | * 02-29-08 02.00.02 Modified various names to make them 32-character unique. |
285 | * 05-06-09 02.00.03 Added ISTWI Read Write Tool and Diagnostic CLI Tool. | 322 | * 05-06-09 02.00.03 Added ISTWI Read Write Tool and Diagnostic CLI Tool. |
323 | * 07-30-09 02.00.04 Added ExtendedType field to DiagnosticBufferPost request | ||
324 | * and reply messages. | ||
325 | * Added MPI2_DIAG_BUF_TYPE_EXTENDED. | ||
326 | * Incremented MPI2_DIAG_BUF_TYPE_COUNT. | ||
286 | * -------------------------------------------------------------------------- | 327 | * -------------------------------------------------------------------------- |
287 | 328 | ||
288 | mpi2_type.h | 329 | mpi2_type.h |
@@ -293,20 +334,26 @@ mpi2_ra.h | |||
293 | * 05-06-09 02.00.00 Initial version. | 334 | * 05-06-09 02.00.00 Initial version. |
294 | * -------------------------------------------------------------------------- | 335 | * -------------------------------------------------------------------------- |
295 | 336 | ||
337 | mpi2_hbd.h | ||
338 | * 10-28-09 02.00.00 Initial version. | ||
339 | * -------------------------------------------------------------------------- | ||
340 | |||
341 | |||
296 | mpi2_history.txt Parts list history | 342 | mpi2_history.txt Parts list history |
297 | 343 | ||
298 | Filename 02.00.12 | 344 | Filename 02.00.14 02.00.13 02.00.12 |
299 | ---------- -------- | 345 | ---------- -------- -------- -------- |
300 | mpi2.h 02.00.12 | 346 | mpi2.h 02.00.14 02.00.13 02.00.12 |
301 | mpi2_cnfg.h 02.00.11 | 347 | mpi2_cnfg.h 02.00.13 02.00.12 02.00.11 |
302 | mpi2_init.h 02.00.07 | 348 | mpi2_init.h 02.00.08 02.00.07 02.00.07 |
303 | mpi2_ioc.h 02.00.11 | 349 | mpi2_ioc.h 02.00.13 02.00.12 02.00.11 |
304 | mpi2_raid.h 02.00.03 | 350 | mpi2_raid.h 02.00.04 02.00.04 02.00.03 |
305 | mpi2_sas.h 02.00.02 | 351 | mpi2_sas.h 02.00.03 02.00.02 02.00.02 |
306 | mpi2_targ.h 02.00.03 | 352 | mpi2_targ.h 02.00.03 02.00.03 02.00.03 |
307 | mpi2_tool.h 02.00.03 | 353 | mpi2_tool.h 02.00.04 02.00.04 02.00.03 |
308 | mpi2_type.h 02.00.00 | 354 | mpi2_type.h 02.00.00 02.00.00 02.00.00 |
309 | mpi2_ra.h 02.00.00 | 355 | mpi2_ra.h 02.00.00 02.00.00 02.00.00 |
356 | mpi2_hbd.h 02.00.00 | ||
310 | 357 | ||
311 | Filename 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 | 358 | Filename 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 |
312 | ---------- -------- -------- -------- -------- -------- -------- | 359 | ---------- -------- -------- -------- -------- -------- -------- |
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_init.h b/drivers/scsi/mpt2sas/mpi/mpi2_init.h index 563e56d2e945..6541945e97c3 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_init.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2_init.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Title: MPI SCSI initiator mode messages and structures | 6 | * Title: MPI SCSI initiator mode messages and structures |
7 | * Creation Date: June 23, 2006 | 7 | * Creation Date: June 23, 2006 |
8 | * | 8 | * |
9 | * mpi2_init.h Version: 02.00.07 | 9 | * mpi2_init.h Version: 02.00.08 |
10 | * | 10 | * |
11 | * Version History | 11 | * Version History |
12 | * --------------- | 12 | * --------------- |
@@ -27,6 +27,10 @@ | |||
27 | * Query Asynchronous Event. | 27 | * Query Asynchronous Event. |
28 | * Defined two new bits in the SlotStatus field of the SCSI | 28 | * Defined two new bits in the SlotStatus field of the SCSI |
29 | * Enclosure Processor Request and Reply. | 29 | * Enclosure Processor Request and Reply. |
30 | * 10-28-09 02.00.08 Added defines for decoding the ResponseInfo bytes for | ||
31 | * both SCSI IO Error Reply and SCSI Task Management Reply. | ||
32 | * Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY. | ||
33 | * Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define. | ||
30 | * -------------------------------------------------------------------------- | 34 | * -------------------------------------------------------------------------- |
31 | */ | 35 | */ |
32 | 36 | ||
@@ -254,6 +258,11 @@ typedef struct _MPI2_SCSI_IO_REPLY | |||
254 | #define MPI2_SCSI_STATE_AUTOSENSE_FAILED (0x02) | 258 | #define MPI2_SCSI_STATE_AUTOSENSE_FAILED (0x02) |
255 | #define MPI2_SCSI_STATE_AUTOSENSE_VALID (0x01) | 259 | #define MPI2_SCSI_STATE_AUTOSENSE_VALID (0x01) |
256 | 260 | ||
261 | /* masks and shifts for the ResponseInfo field */ | ||
262 | |||
263 | #define MPI2_SCSI_RI_MASK_REASONCODE (0x000000FF) | ||
264 | #define MPI2_SCSI_RI_SHIFT_REASONCODE (0) | ||
265 | |||
257 | #define MPI2_SCSI_TASKTAG_UNKNOWN (0xFFFF) | 266 | #define MPI2_SCSI_TASKTAG_UNKNOWN (0xFFFF) |
258 | 267 | ||
259 | 268 | ||
@@ -327,6 +336,7 @@ typedef struct _MPI2_SCSI_TASK_MANAGE_REPLY | |||
327 | U16 IOCStatus; /* 0x0E */ | 336 | U16 IOCStatus; /* 0x0E */ |
328 | U32 IOCLogInfo; /* 0x10 */ | 337 | U32 IOCLogInfo; /* 0x10 */ |
329 | U32 TerminationCount; /* 0x14 */ | 338 | U32 TerminationCount; /* 0x14 */ |
339 | U32 ResponseInfo; /* 0x18 */ | ||
330 | } MPI2_SCSI_TASK_MANAGE_REPLY, | 340 | } MPI2_SCSI_TASK_MANAGE_REPLY, |
331 | MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REPLY, | 341 | MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REPLY, |
332 | Mpi2SCSITaskManagementReply_t, MPI2_POINTER pMpi2SCSIManagementReply_t; | 342 | Mpi2SCSITaskManagementReply_t, MPI2_POINTER pMpi2SCSIManagementReply_t; |
@@ -339,8 +349,20 @@ typedef struct _MPI2_SCSI_TASK_MANAGE_REPLY | |||
339 | #define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05) | 349 | #define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05) |
340 | #define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08) | 350 | #define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08) |
341 | #define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09) | 351 | #define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09) |
352 | #define MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG (0x0A) | ||
342 | #define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80) | 353 | #define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80) |
343 | 354 | ||
355 | /* masks and shifts for the ResponseInfo field */ | ||
356 | |||
357 | #define MPI2_SCSITASKMGMT_RI_MASK_REASONCODE (0x000000FF) | ||
358 | #define MPI2_SCSITASKMGMT_RI_SHIFT_REASONCODE (0) | ||
359 | #define MPI2_SCSITASKMGMT_RI_MASK_ARI2 (0x0000FF00) | ||
360 | #define MPI2_SCSITASKMGMT_RI_SHIFT_ARI2 (8) | ||
361 | #define MPI2_SCSITASKMGMT_RI_MASK_ARI1 (0x00FF0000) | ||
362 | #define MPI2_SCSITASKMGMT_RI_SHIFT_ARI1 (16) | ||
363 | #define MPI2_SCSITASKMGMT_RI_MASK_ARI0 (0xFF000000) | ||
364 | #define MPI2_SCSITASKMGMT_RI_SHIFT_ARI0 (24) | ||
365 | |||
344 | 366 | ||
345 | /**************************************************************************** | 367 | /**************************************************************************** |
346 | * SCSI Enclosure Processor messages | 368 | * SCSI Enclosure Processor messages |
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_ioc.h b/drivers/scsi/mpt2sas/mpi/mpi2_ioc.h index ea51ce868690..754938422f6a 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_ioc.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2_ioc.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages | 6 | * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages |
7 | * Creation Date: October 11, 2006 | 7 | * Creation Date: October 11, 2006 |
8 | * | 8 | * |
9 | * mpi2_ioc.h Version: 02.00.12 | 9 | * mpi2_ioc.h Version: 02.00.13 |
10 | * | 10 | * |
11 | * Version History | 11 | * Version History |
12 | * --------------- | 12 | * --------------- |
@@ -87,6 +87,17 @@ | |||
87 | * 07-30-09 02.00.12 Added GPIO Interrupt event define and structure. | 87 | * 07-30-09 02.00.12 Added GPIO Interrupt event define and structure. |
88 | * Added MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. | 88 | * Added MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. |
89 | * Added new product id family for 2208. | 89 | * Added new product id family for 2208. |
90 | * 10-28-09 02.00.13 Added HostMSIxVectors field to MPI2_IOC_INIT_REQUEST. | ||
91 | * Added MaxMSIxVectors field to MPI2_IOC_FACTS_REPLY. | ||
92 | * Added MinDevHandle field to MPI2_IOC_FACTS_REPLY. | ||
93 | * Added MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY. | ||
94 | * Added MPI2_EVENT_HOST_BASED_DISCOVERY_PHY define. | ||
95 | * Added MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER define. | ||
96 | * Added Host Based Discovery Phy Event data. | ||
97 | * Added defines for ProductID Product field | ||
98 | * (MPI2_FW_HEADER_PID_). | ||
99 | * Modified values for SAS ProductID Family | ||
100 | * (MPI2_FW_HEADER_PID_FAMILY_). | ||
90 | * -------------------------------------------------------------------------- | 101 | * -------------------------------------------------------------------------- |
91 | */ | 102 | */ |
92 | 103 | ||
@@ -119,8 +130,10 @@ typedef struct _MPI2_IOC_INIT_REQUEST | |||
119 | U16 MsgVersion; /* 0x0C */ | 130 | U16 MsgVersion; /* 0x0C */ |
120 | U16 HeaderVersion; /* 0x0E */ | 131 | U16 HeaderVersion; /* 0x0E */ |
121 | U32 Reserved5; /* 0x10 */ | 132 | U32 Reserved5; /* 0x10 */ |
122 | U32 Reserved6; /* 0x14 */ | 133 | U16 Reserved6; /* 0x14 */ |
123 | U16 Reserved7; /* 0x18 */ | 134 | U8 Reserved7; /* 0x16 */ |
135 | U8 HostMSIxVectors; /* 0x17 */ | ||
136 | U16 Reserved8; /* 0x18 */ | ||
124 | U16 SystemRequestFrameSize; /* 0x1A */ | 137 | U16 SystemRequestFrameSize; /* 0x1A */ |
125 | U16 ReplyDescriptorPostQueueDepth; /* 0x1C */ | 138 | U16 ReplyDescriptorPostQueueDepth; /* 0x1C */ |
126 | U16 ReplyFreeQueueDepth; /* 0x1E */ | 139 | U16 ReplyFreeQueueDepth; /* 0x1E */ |
@@ -215,7 +228,7 @@ typedef struct _MPI2_IOC_FACTS_REPLY | |||
215 | U8 MaxChainDepth; /* 0x14 */ | 228 | U8 MaxChainDepth; /* 0x14 */ |
216 | U8 WhoInit; /* 0x15 */ | 229 | U8 WhoInit; /* 0x15 */ |
217 | U8 NumberOfPorts; /* 0x16 */ | 230 | U8 NumberOfPorts; /* 0x16 */ |
218 | U8 Reserved2; /* 0x17 */ | 231 | U8 MaxMSIxVectors; /* 0x17 */ |
219 | U16 RequestCredit; /* 0x18 */ | 232 | U16 RequestCredit; /* 0x18 */ |
220 | U16 ProductID; /* 0x1A */ | 233 | U16 ProductID; /* 0x1A */ |
221 | U32 IOCCapabilities; /* 0x1C */ | 234 | U32 IOCCapabilities; /* 0x1C */ |
@@ -233,7 +246,8 @@ typedef struct _MPI2_IOC_FACTS_REPLY | |||
233 | U8 MaxVolumes; /* 0x37 */ | 246 | U8 MaxVolumes; /* 0x37 */ |
234 | U16 MaxDevHandle; /* 0x38 */ | 247 | U16 MaxDevHandle; /* 0x38 */ |
235 | U16 MaxPersistentEntries; /* 0x3A */ | 248 | U16 MaxPersistentEntries; /* 0x3A */ |
236 | U32 Reserved4; /* 0x3C */ | 249 | U16 MinDevHandle; /* 0x3C */ |
250 | U16 Reserved4; /* 0x3E */ | ||
237 | } MPI2_IOC_FACTS_REPLY, MPI2_POINTER PTR_MPI2_IOC_FACTS_REPLY, | 251 | } MPI2_IOC_FACTS_REPLY, MPI2_POINTER PTR_MPI2_IOC_FACTS_REPLY, |
238 | Mpi2IOCFactsReply_t, MPI2_POINTER pMpi2IOCFactsReply_t; | 252 | Mpi2IOCFactsReply_t, MPI2_POINTER pMpi2IOCFactsReply_t; |
239 | 253 | ||
@@ -269,6 +283,7 @@ typedef struct _MPI2_IOC_FACTS_REPLY | |||
269 | /* ProductID field uses MPI2_FW_HEADER_PID_ */ | 283 | /* ProductID field uses MPI2_FW_HEADER_PID_ */ |
270 | 284 | ||
271 | /* IOCCapabilities */ | 285 | /* IOCCapabilities */ |
286 | #define MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY (0x00010000) | ||
272 | #define MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX (0x00008000) | 287 | #define MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX (0x00008000) |
273 | #define MPI2_IOCFACTS_CAPABILITY_RAID_ACCELERATOR (0x00004000) | 288 | #define MPI2_IOCFACTS_CAPABILITY_RAID_ACCELERATOR (0x00004000) |
274 | #define MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY (0x00002000) | 289 | #define MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY (0x00002000) |
@@ -453,6 +468,7 @@ typedef struct _MPI2_EVENT_NOTIFICATION_REPLY | |||
453 | #define MPI2_EVENT_LOG_ENTRY_ADDED (0x0021) | 468 | #define MPI2_EVENT_LOG_ENTRY_ADDED (0x0021) |
454 | #define MPI2_EVENT_SAS_PHY_COUNTER (0x0022) | 469 | #define MPI2_EVENT_SAS_PHY_COUNTER (0x0022) |
455 | #define MPI2_EVENT_GPIO_INTERRUPT (0x0023) | 470 | #define MPI2_EVENT_GPIO_INTERRUPT (0x0023) |
471 | #define MPI2_EVENT_HOST_BASED_DISCOVERY_PHY (0x0024) | ||
456 | 472 | ||
457 | 473 | ||
458 | /* Log Entry Added Event data */ | 474 | /* Log Entry Added Event data */ |
@@ -793,6 +809,7 @@ typedef struct _MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST | |||
793 | MPI2_POINTER pMpi2EventDataSasTopologyChangeList_t; | 809 | MPI2_POINTER pMpi2EventDataSasTopologyChangeList_t; |
794 | 810 | ||
795 | /* values for the ExpStatus field */ | 811 | /* values for the ExpStatus field */ |
812 | #define MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER (0x00) | ||
796 | #define MPI2_EVENT_SAS_TOPO_ES_ADDED (0x01) | 813 | #define MPI2_EVENT_SAS_TOPO_ES_ADDED (0x01) |
797 | #define MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING (0x02) | 814 | #define MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING (0x02) |
798 | #define MPI2_EVENT_SAS_TOPO_ES_RESPONDING (0x03) | 815 | #define MPI2_EVENT_SAS_TOPO_ES_RESPONDING (0x03) |
@@ -878,6 +895,44 @@ typedef struct _MPI2_EVENT_DATA_SAS_PHY_COUNTER { | |||
878 | * */ | 895 | * */ |
879 | 896 | ||
880 | 897 | ||
898 | /* Host Based Discovery Phy Event data */ | ||
899 | |||
900 | typedef struct _MPI2_EVENT_HBD_PHY_SAS { | ||
901 | U8 Flags; /* 0x00 */ | ||
902 | U8 NegotiatedLinkRate; /* 0x01 */ | ||
903 | U8 PhyNum; /* 0x02 */ | ||
904 | U8 PhysicalPort; /* 0x03 */ | ||
905 | U32 Reserved1; /* 0x04 */ | ||
906 | U8 InitialFrame[28]; /* 0x08 */ | ||
907 | } MPI2_EVENT_HBD_PHY_SAS, MPI2_POINTER PTR_MPI2_EVENT_HBD_PHY_SAS, | ||
908 | Mpi2EventHbdPhySas_t, MPI2_POINTER pMpi2EventHbdPhySas_t; | ||
909 | |||
910 | /* values for the Flags field */ | ||
911 | #define MPI2_EVENT_HBD_SAS_FLAGS_FRAME_VALID (0x02) | ||
912 | #define MPI2_EVENT_HBD_SAS_FLAGS_SATA_FRAME (0x01) | ||
913 | |||
914 | /* use MPI2_SAS_NEG_LINK_RATE_ defines from mpi2_cnfg.h for | ||
915 | * the NegotiatedLinkRate field */ | ||
916 | |||
917 | typedef union _MPI2_EVENT_HBD_DESCRIPTOR { | ||
918 | MPI2_EVENT_HBD_PHY_SAS Sas; | ||
919 | } MPI2_EVENT_HBD_DESCRIPTOR, MPI2_POINTER PTR_MPI2_EVENT_HBD_DESCRIPTOR, | ||
920 | Mpi2EventHbdDescriptor_t, MPI2_POINTER pMpi2EventHbdDescriptor_t; | ||
921 | |||
922 | typedef struct _MPI2_EVENT_DATA_HBD_PHY { | ||
923 | U8 DescriptorType; /* 0x00 */ | ||
924 | U8 Reserved1; /* 0x01 */ | ||
925 | U16 Reserved2; /* 0x02 */ | ||
926 | U32 Reserved3; /* 0x04 */ | ||
927 | MPI2_EVENT_HBD_DESCRIPTOR Descriptor; /* 0x08 */ | ||
928 | } MPI2_EVENT_DATA_HBD_PHY, MPI2_POINTER PTR_MPI2_EVENT_DATA_HBD_PHY, | ||
929 | Mpi2EventDataHbdPhy_t, MPI2_POINTER pMpi2EventDataMpi2EventDataHbdPhy_t; | ||
930 | |||
931 | /* values for the DescriptorType field */ | ||
932 | #define MPI2_EVENT_HBD_DT_SAS (0x01) | ||
933 | |||
934 | |||
935 | |||
881 | /**************************************************************************** | 936 | /**************************************************************************** |
882 | * EventAck message | 937 | * EventAck message |
883 | ****************************************************************************/ | 938 | ****************************************************************************/ |
@@ -1126,13 +1181,17 @@ typedef struct _MPI2_FW_IMAGE_HEADER | |||
1126 | #define MPI2_FW_HEADER_PID_TYPE_MASK (0xF000) | 1181 | #define MPI2_FW_HEADER_PID_TYPE_MASK (0xF000) |
1127 | #define MPI2_FW_HEADER_PID_TYPE_SAS (0x2000) | 1182 | #define MPI2_FW_HEADER_PID_TYPE_SAS (0x2000) |
1128 | 1183 | ||
1129 | #define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00) | 1184 | #define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00) |
1130 | #define MPI2_FW_HEADER_PID_PROD_A (0x0000) | 1185 | #define MPI2_FW_HEADER_PID_PROD_A (0x0000) |
1186 | #define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00) | ||
1187 | #define MPI2_FW_HEADER_PID_PROD_TARGET_INITIATOR_SCSI (0x0200) | ||
1188 | #define MPI2_FW_HEADER_PID_PROD_IR_SCSI (0x0700) | ||
1189 | |||
1131 | 1190 | ||
1132 | #define MPI2_FW_HEADER_PID_FAMILY_MASK (0x00FF) | 1191 | #define MPI2_FW_HEADER_PID_FAMILY_MASK (0x00FF) |
1133 | /* SAS */ | 1192 | /* SAS */ |
1134 | #define MPI2_FW_HEADER_PID_FAMILY_2108_SAS (0x0010) | 1193 | #define MPI2_FW_HEADER_PID_FAMILY_2108_SAS (0x0013) |
1135 | #define MPI2_FW_HEADER_PID_FAMILY_2208_SAS (0x0011) | 1194 | #define MPI2_FW_HEADER_PID_FAMILY_2208_SAS (0x0014) |
1136 | 1195 | ||
1137 | /* use MPI2_IOCFACTS_PROTOCOL_ defines for ProtocolFlags field */ | 1196 | /* use MPI2_IOCFACTS_PROTOCOL_ defines for ProtocolFlags field */ |
1138 | 1197 | ||
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_sas.h b/drivers/scsi/mpt2sas/mpi/mpi2_sas.h index 8a42b136cf53..2d8aeed51392 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_sas.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2_sas.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Title: MPI Serial Attached SCSI structures and definitions | 6 | * Title: MPI Serial Attached SCSI structures and definitions |
7 | * Creation Date: February 9, 2007 | 7 | * Creation Date: February 9, 2007 |
8 | * | 8 | * |
9 | * mpi2.h Version: 02.00.02 | 9 | * mpi2.h Version: 02.00.03 |
10 | * | 10 | * |
11 | * Version History | 11 | * Version History |
12 | * --------------- | 12 | * --------------- |
@@ -18,6 +18,8 @@ | |||
18 | * Control Request. | 18 | * Control Request. |
19 | * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control | 19 | * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control |
20 | * Request. | 20 | * Request. |
21 | * 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST | ||
22 | * to MPI2_SGE_IO_UNION since it supports chained SGLs. | ||
21 | * -------------------------------------------------------------------------- | 23 | * -------------------------------------------------------------------------- |
22 | */ | 24 | */ |
23 | 25 | ||
@@ -160,7 +162,7 @@ typedef struct _MPI2_SATA_PASSTHROUGH_REQUEST | |||
160 | U32 Reserved4; /* 0x14 */ | 162 | U32 Reserved4; /* 0x14 */ |
161 | U32 DataLength; /* 0x18 */ | 163 | U32 DataLength; /* 0x18 */ |
162 | U8 CommandFIS[20]; /* 0x1C */ | 164 | U8 CommandFIS[20]; /* 0x1C */ |
163 | MPI2_SIMPLE_SGE_UNION SGL; /* 0x20 */ | 165 | MPI2_SGE_IO_UNION SGL; /* 0x20 */ |
164 | } MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST, | 166 | } MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST, |
165 | Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t; | 167 | Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t; |
166 | 168 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 89d02401b9ec..88e6eebc3159 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
@@ -107,8 +107,7 @@ _scsih_set_fwfault_debug(const char *val, struct kernel_param *kp) | |||
107 | if (ret) | 107 | if (ret) |
108 | return ret; | 108 | return ret; |
109 | 109 | ||
110 | printk(KERN_INFO "setting logging_level(0x%08x)\n", | 110 | printk(KERN_INFO "setting fwfault_debug(%d)\n", mpt2sas_fwfault_debug); |
111 | mpt2sas_fwfault_debug); | ||
112 | list_for_each_entry(ioc, &mpt2sas_ioc_list, list) | 111 | list_for_each_entry(ioc, &mpt2sas_ioc_list, list) |
113 | ioc->fwfault_debug = mpt2sas_fwfault_debug; | 112 | ioc->fwfault_debug = mpt2sas_fwfault_debug; |
114 | return 0; | 113 | return 0; |
@@ -1222,6 +1221,8 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
1222 | u32 memap_sz; | 1221 | u32 memap_sz; |
1223 | u32 pio_sz; | 1222 | u32 pio_sz; |
1224 | int i, r = 0; | 1223 | int i, r = 0; |
1224 | u64 pio_chip = 0; | ||
1225 | u64 chip_phys = 0; | ||
1225 | 1226 | ||
1226 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", | 1227 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", |
1227 | ioc->name, __func__)); | 1228 | ioc->name, __func__)); |
@@ -1255,12 +1256,13 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
1255 | if (pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO) { | 1256 | if (pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO) { |
1256 | if (pio_sz) | 1257 | if (pio_sz) |
1257 | continue; | 1258 | continue; |
1258 | ioc->pio_chip = pci_resource_start(pdev, i); | 1259 | pio_chip = (u64)pci_resource_start(pdev, i); |
1259 | pio_sz = pci_resource_len(pdev, i); | 1260 | pio_sz = pci_resource_len(pdev, i); |
1260 | } else { | 1261 | } else { |
1261 | if (memap_sz) | 1262 | if (memap_sz) |
1262 | continue; | 1263 | continue; |
1263 | ioc->chip_phys = pci_resource_start(pdev, i); | 1264 | ioc->chip_phys = pci_resource_start(pdev, i); |
1265 | chip_phys = (u64)ioc->chip_phys; | ||
1264 | memap_sz = pci_resource_len(pdev, i); | 1266 | memap_sz = pci_resource_len(pdev, i); |
1265 | ioc->chip = ioremap(ioc->chip_phys, memap_sz); | 1267 | ioc->chip = ioremap(ioc->chip_phys, memap_sz); |
1266 | if (ioc->chip == NULL) { | 1268 | if (ioc->chip == NULL) { |
@@ -1280,10 +1282,10 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
1280 | printk(MPT2SAS_INFO_FMT "%s: IRQ %d\n", | 1282 | printk(MPT2SAS_INFO_FMT "%s: IRQ %d\n", |
1281 | ioc->name, ((ioc->msix_enable) ? "PCI-MSI-X enabled" : | 1283 | ioc->name, ((ioc->msix_enable) ? "PCI-MSI-X enabled" : |
1282 | "IO-APIC enabled"), ioc->pci_irq); | 1284 | "IO-APIC enabled"), ioc->pci_irq); |
1283 | printk(MPT2SAS_INFO_FMT "iomem(0x%lx), mapped(0x%p), size(%d)\n", | 1285 | printk(MPT2SAS_INFO_FMT "iomem(0x%016llx), mapped(0x%p), size(%d)\n", |
1284 | ioc->name, ioc->chip_phys, ioc->chip, memap_sz); | 1286 | ioc->name, (unsigned long long)chip_phys, ioc->chip, memap_sz); |
1285 | printk(MPT2SAS_INFO_FMT "ioport(0x%lx), size(%d)\n", | 1287 | printk(MPT2SAS_INFO_FMT "ioport(0x%016llx), size(%d)\n", |
1286 | ioc->name, ioc->pio_chip, pio_sz); | 1288 | ioc->name, (unsigned long long)pio_chip, pio_sz); |
1287 | 1289 | ||
1288 | return 0; | 1290 | return 0; |
1289 | 1291 | ||
@@ -3573,6 +3575,8 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
3573 | 3575 | ||
3574 | init_waitqueue_head(&ioc->reset_wq); | 3576 | init_waitqueue_head(&ioc->reset_wq); |
3575 | 3577 | ||
3578 | ioc->fwfault_debug = mpt2sas_fwfault_debug; | ||
3579 | |||
3576 | /* base internal command bits */ | 3580 | /* base internal command bits */ |
3577 | mutex_init(&ioc->base_cmds.mutex); | 3581 | mutex_init(&ioc->base_cmds.mutex); |
3578 | ioc->base_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); | 3582 | ioc->base_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index bb4f14656afa..e18b0544c38f 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h | |||
@@ -69,10 +69,10 @@ | |||
69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" | 69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" |
70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" | 70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" |
71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" | 71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" |
72 | #define MPT2SAS_DRIVER_VERSION "03.100.03.00" | 72 | #define MPT2SAS_DRIVER_VERSION "04.100.01.00" |
73 | #define MPT2SAS_MAJOR_VERSION 03 | 73 | #define MPT2SAS_MAJOR_VERSION 04 |
74 | #define MPT2SAS_MINOR_VERSION 100 | 74 | #define MPT2SAS_MINOR_VERSION 100 |
75 | #define MPT2SAS_BUILD_VERSION 03 | 75 | #define MPT2SAS_BUILD_VERSION 01 |
76 | #define MPT2SAS_RELEASE_VERSION 00 | 76 | #define MPT2SAS_RELEASE_VERSION 00 |
77 | 77 | ||
78 | /* | 78 | /* |
@@ -323,6 +323,7 @@ struct _sas_device { | |||
323 | * @device_info: bitfield provides detailed info about the hidden components | 323 | * @device_info: bitfield provides detailed info about the hidden components |
324 | * @num_pds: number of hidden raid components | 324 | * @num_pds: number of hidden raid components |
325 | * @responding: used in _scsih_raid_device_mark_responding | 325 | * @responding: used in _scsih_raid_device_mark_responding |
326 | * @percent_complete: resync percent complete | ||
326 | */ | 327 | */ |
327 | struct _raid_device { | 328 | struct _raid_device { |
328 | struct list_head list; | 329 | struct list_head list; |
@@ -336,6 +337,7 @@ struct _raid_device { | |||
336 | u32 device_info; | 337 | u32 device_info; |
337 | u8 num_pds; | 338 | u8 num_pds; |
338 | u8 responding; | 339 | u8 responding; |
340 | u8 percent_complete; | ||
339 | }; | 341 | }; |
340 | 342 | ||
341 | /** | 343 | /** |
@@ -464,7 +466,6 @@ typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr); | |||
464 | * @pdev: pci pdev object | 466 | * @pdev: pci pdev object |
465 | * @chip: memory mapped register space | 467 | * @chip: memory mapped register space |
466 | * @chip_phys: physical addrss prior to mapping | 468 | * @chip_phys: physical addrss prior to mapping |
467 | * @pio_chip: I/O mapped register space | ||
468 | * @logging_level: see mpt2sas_debug.h | 469 | * @logging_level: see mpt2sas_debug.h |
469 | * @fwfault_debug: debuging FW timeouts | 470 | * @fwfault_debug: debuging FW timeouts |
470 | * @ir_firmware: IR firmware present | 471 | * @ir_firmware: IR firmware present |
@@ -587,8 +588,7 @@ struct MPT2SAS_ADAPTER { | |||
587 | char tmp_string[MPT_STRING_LENGTH]; | 588 | char tmp_string[MPT_STRING_LENGTH]; |
588 | struct pci_dev *pdev; | 589 | struct pci_dev *pdev; |
589 | Mpi2SystemInterfaceRegs_t __iomem *chip; | 590 | Mpi2SystemInterfaceRegs_t __iomem *chip; |
590 | unsigned long chip_phys; | 591 | resource_size_t chip_phys; |
591 | unsigned long pio_chip; | ||
592 | int logging_level; | 592 | int logging_level; |
593 | int fwfault_debug; | 593 | int fwfault_debug; |
594 | u8 ir_firmware; | 594 | u8 ir_firmware; |
@@ -853,6 +853,8 @@ int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
853 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); | 853 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); |
854 | int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 854 | int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
855 | *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz); | 855 | *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz); |
856 | int mpt2sas_config_set_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | ||
857 | Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz); | ||
856 | int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 858 | int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
857 | *mpi_reply, Mpi2IOCPage8_t *config_page); | 859 | *mpi_reply, Mpi2IOCPage8_t *config_page); |
858 | int mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 860 | int mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 594a389c6526..411c27d7f787 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
@@ -324,7 +324,9 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
324 | if (r != 0) | 324 | if (r != 0) |
325 | goto out; | 325 | goto out; |
326 | if (mpi_request->Action == | 326 | if (mpi_request->Action == |
327 | MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT) { | 327 | MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT || |
328 | mpi_request->Action == | ||
329 | MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) { | ||
328 | ioc->base_add_sg_single(&mpi_request->PageBufferSGE, | 330 | ioc->base_add_sg_single(&mpi_request->PageBufferSGE, |
329 | MPT2_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz, | 331 | MPT2_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz, |
330 | mem.page_dma); | 332 | mem.page_dma); |
@@ -882,7 +884,7 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
882 | } | 884 | } |
883 | 885 | ||
884 | /** | 886 | /** |
885 | * mpt2sas_config_get_sas_iounit_pg1 - obtain sas iounit page 0 | 887 | * mpt2sas_config_get_sas_iounit_pg1 - obtain sas iounit page 1 |
886 | * @ioc: per adapter object | 888 | * @ioc: per adapter object |
887 | * @mpi_reply: reply mf payload returned from firmware | 889 | * @mpi_reply: reply mf payload returned from firmware |
888 | * @config_page: contents of the config page | 890 | * @config_page: contents of the config page |
@@ -907,7 +909,7 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
907 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; | 909 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; |
908 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; | 910 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; |
909 | mpi_request.Header.PageNumber = 1; | 911 | mpi_request.Header.PageNumber = 1; |
910 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION; | 912 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION; |
911 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); | 913 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); |
912 | r = _config_request(ioc, &mpi_request, mpi_reply, | 914 | r = _config_request(ioc, &mpi_request, mpi_reply, |
913 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | 915 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); |
@@ -922,6 +924,49 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
922 | } | 924 | } |
923 | 925 | ||
924 | /** | 926 | /** |
927 | * mpt2sas_config_set_sas_iounit_pg1 - send sas iounit page 1 | ||
928 | * @ioc: per adapter object | ||
929 | * @mpi_reply: reply mf payload returned from firmware | ||
930 | * @config_page: contents of the config page | ||
931 | * @sz: size of buffer passed in config_page | ||
932 | * Context: sleep. | ||
933 | * | ||
934 | * Calling function should call config_get_number_hba_phys prior to | ||
935 | * this function, so enough memory is allocated for config_page. | ||
936 | * | ||
937 | * Returns 0 for success, non-zero for failure. | ||
938 | */ | ||
939 | int | ||
940 | mpt2sas_config_set_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | ||
941 | *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz) | ||
942 | { | ||
943 | Mpi2ConfigRequest_t mpi_request; | ||
944 | int r; | ||
945 | |||
946 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | ||
947 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | ||
948 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | ||
949 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; | ||
950 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; | ||
951 | mpi_request.Header.PageNumber = 1; | ||
952 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION; | ||
953 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); | ||
954 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
955 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | ||
956 | if (r) | ||
957 | goto out; | ||
958 | |||
959 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT; | ||
960 | _config_request(ioc, &mpi_request, mpi_reply, | ||
961 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); | ||
962 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM; | ||
963 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
964 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); | ||
965 | out: | ||
966 | return r; | ||
967 | } | ||
968 | |||
969 | /** | ||
925 | * mpt2sas_config_get_expander_pg0 - obtain expander page 0 | 970 | * mpt2sas_config_get_expander_pg0 - obtain expander page 0 |
926 | * @ioc: per adapter object | 971 | * @ioc: per adapter object |
927 | * @mpi_reply: reply mf payload returned from firmware | 972 | * @mpi_reply: reply mf payload returned from firmware |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c index 84a124f8e21f..fa9bf83819d5 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c | |||
@@ -891,6 +891,7 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
891 | 891 | ||
892 | issue_host_reset: | 892 | issue_host_reset: |
893 | if (issue_reset) { | 893 | if (issue_reset) { |
894 | ret = -ENODATA; | ||
894 | if ((mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || | 895 | if ((mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || |
895 | mpi_request->Function == | 896 | mpi_request->Function == |
896 | MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { | 897 | MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { |
@@ -2202,14 +2203,10 @@ _ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg) | |||
2202 | karg.data_out_size = karg32.data_out_size; | 2203 | karg.data_out_size = karg32.data_out_size; |
2203 | karg.max_sense_bytes = karg32.max_sense_bytes; | 2204 | karg.max_sense_bytes = karg32.max_sense_bytes; |
2204 | karg.data_sge_offset = karg32.data_sge_offset; | 2205 | karg.data_sge_offset = karg32.data_sge_offset; |
2205 | memcpy(&karg.reply_frame_buf_ptr, &karg32.reply_frame_buf_ptr, | 2206 | karg.reply_frame_buf_ptr = compat_ptr(karg32.reply_frame_buf_ptr); |
2206 | sizeof(uint32_t)); | 2207 | karg.data_in_buf_ptr = compat_ptr(karg32.data_in_buf_ptr); |
2207 | memcpy(&karg.data_in_buf_ptr, &karg32.data_in_buf_ptr, | 2208 | karg.data_out_buf_ptr = compat_ptr(karg32.data_out_buf_ptr); |
2208 | sizeof(uint32_t)); | 2209 | karg.sense_data_ptr = compat_ptr(karg32.sense_data_ptr); |
2209 | memcpy(&karg.data_out_buf_ptr, &karg32.data_out_buf_ptr, | ||
2210 | sizeof(uint32_t)); | ||
2211 | memcpy(&karg.sense_data_ptr, &karg32.sense_data_ptr, | ||
2212 | sizeof(uint32_t)); | ||
2213 | state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING; | 2210 | state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING; |
2214 | return _ctl_do_mpt_command(ioc, karg, &uarg->mf, state); | 2211 | return _ctl_do_mpt_command(ioc, karg, &uarg->mf, state); |
2215 | } | 2212 | } |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index efabea1a3ce4..c7ec3f174782 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/delay.h> | 52 | #include <linux/delay.h> |
53 | #include <linux/pci.h> | 53 | #include <linux/pci.h> |
54 | #include <linux/interrupt.h> | 54 | #include <linux/interrupt.h> |
55 | #include <linux/raid_class.h> | ||
55 | 56 | ||
56 | #include "mpt2sas_base.h" | 57 | #include "mpt2sas_base.h" |
57 | 58 | ||
@@ -133,6 +134,9 @@ struct fw_event_work { | |||
133 | void *event_data; | 134 | void *event_data; |
134 | }; | 135 | }; |
135 | 136 | ||
137 | /* raid transport support */ | ||
138 | static struct raid_template *mpt2sas_raid_template; | ||
139 | |||
136 | /** | 140 | /** |
137 | * struct _scsi_io_transfer - scsi io transfer | 141 | * struct _scsi_io_transfer - scsi io transfer |
138 | * @handle: sas device handle (assigned by firmware) | 142 | * @handle: sas device handle (assigned by firmware) |
@@ -1305,7 +1309,6 @@ _scsih_slave_alloc(struct scsi_device *sdev) | |||
1305 | struct MPT2SAS_DEVICE *sas_device_priv_data; | 1309 | struct MPT2SAS_DEVICE *sas_device_priv_data; |
1306 | struct scsi_target *starget; | 1310 | struct scsi_target *starget; |
1307 | struct _raid_device *raid_device; | 1311 | struct _raid_device *raid_device; |
1308 | struct _sas_device *sas_device; | ||
1309 | unsigned long flags; | 1312 | unsigned long flags; |
1310 | 1313 | ||
1311 | sas_device_priv_data = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); | 1314 | sas_device_priv_data = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); |
@@ -1332,21 +1335,8 @@ _scsih_slave_alloc(struct scsi_device *sdev) | |||
1332 | if (raid_device) | 1335 | if (raid_device) |
1333 | raid_device->sdev = sdev; /* raid is single lun */ | 1336 | raid_device->sdev = sdev; /* raid is single lun */ |
1334 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | 1337 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); |
1335 | } else { | ||
1336 | /* set TLR bit for SSP devices */ | ||
1337 | if (!(ioc->facts.IOCCapabilities & | ||
1338 | MPI2_IOCFACTS_CAPABILITY_TLR)) | ||
1339 | goto out; | ||
1340 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | ||
1341 | sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, | ||
1342 | sas_device_priv_data->sas_target->sas_address); | ||
1343 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
1344 | if (sas_device && sas_device->device_info & | ||
1345 | MPI2_SAS_DEVICE_INFO_SSP_TARGET) | ||
1346 | sas_device_priv_data->flags |= MPT_DEVICE_TLR_ON; | ||
1347 | } | 1338 | } |
1348 | 1339 | ||
1349 | out: | ||
1350 | return 0; | 1340 | return 0; |
1351 | } | 1341 | } |
1352 | 1342 | ||
@@ -1419,6 +1409,140 @@ _scsih_display_sata_capabilities(struct MPT2SAS_ADAPTER *ioc, | |||
1419 | } | 1409 | } |
1420 | 1410 | ||
1421 | /** | 1411 | /** |
1412 | * _scsih_is_raid - return boolean indicating device is raid volume | ||
1413 | * @dev the device struct object | ||
1414 | */ | ||
1415 | static int | ||
1416 | _scsih_is_raid(struct device *dev) | ||
1417 | { | ||
1418 | struct scsi_device *sdev = to_scsi_device(dev); | ||
1419 | |||
1420 | return (sdev->channel == RAID_CHANNEL) ? 1 : 0; | ||
1421 | } | ||
1422 | |||
1423 | /** | ||
1424 | * _scsih_get_resync - get raid volume resync percent complete | ||
1425 | * @dev the device struct object | ||
1426 | */ | ||
1427 | static void | ||
1428 | _scsih_get_resync(struct device *dev) | ||
1429 | { | ||
1430 | struct scsi_device *sdev = to_scsi_device(dev); | ||
1431 | struct MPT2SAS_ADAPTER *ioc = shost_priv(sdev->host); | ||
1432 | static struct _raid_device *raid_device; | ||
1433 | unsigned long flags; | ||
1434 | Mpi2RaidVolPage0_t vol_pg0; | ||
1435 | Mpi2ConfigReply_t mpi_reply; | ||
1436 | u32 volume_status_flags; | ||
1437 | u8 percent_complete = 0; | ||
1438 | |||
1439 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | ||
1440 | raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id, | ||
1441 | sdev->channel); | ||
1442 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | ||
1443 | |||
1444 | if (!raid_device) | ||
1445 | goto out; | ||
1446 | |||
1447 | if (mpt2sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0, | ||
1448 | MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle, | ||
1449 | sizeof(Mpi2RaidVolPage0_t))) { | ||
1450 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1451 | ioc->name, __FILE__, __LINE__, __func__); | ||
1452 | goto out; | ||
1453 | } | ||
1454 | |||
1455 | volume_status_flags = le32_to_cpu(vol_pg0.VolumeStatusFlags); | ||
1456 | if (volume_status_flags & MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) | ||
1457 | percent_complete = raid_device->percent_complete; | ||
1458 | out: | ||
1459 | raid_set_resync(mpt2sas_raid_template, dev, percent_complete); | ||
1460 | } | ||
1461 | |||
1462 | /** | ||
1463 | * _scsih_get_state - get raid volume level | ||
1464 | * @dev the device struct object | ||
1465 | */ | ||
1466 | static void | ||
1467 | _scsih_get_state(struct device *dev) | ||
1468 | { | ||
1469 | struct scsi_device *sdev = to_scsi_device(dev); | ||
1470 | struct MPT2SAS_ADAPTER *ioc = shost_priv(sdev->host); | ||
1471 | static struct _raid_device *raid_device; | ||
1472 | unsigned long flags; | ||
1473 | Mpi2RaidVolPage0_t vol_pg0; | ||
1474 | Mpi2ConfigReply_t mpi_reply; | ||
1475 | u32 volstate; | ||
1476 | enum raid_state state = RAID_STATE_UNKNOWN; | ||
1477 | |||
1478 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | ||
1479 | raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id, | ||
1480 | sdev->channel); | ||
1481 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | ||
1482 | |||
1483 | if (!raid_device) | ||
1484 | goto out; | ||
1485 | |||
1486 | if (mpt2sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0, | ||
1487 | MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle, | ||
1488 | sizeof(Mpi2RaidVolPage0_t))) { | ||
1489 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1490 | ioc->name, __FILE__, __LINE__, __func__); | ||
1491 | goto out; | ||
1492 | } | ||
1493 | |||
1494 | volstate = le32_to_cpu(vol_pg0.VolumeStatusFlags); | ||
1495 | if (volstate & MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) { | ||
1496 | state = RAID_STATE_RESYNCING; | ||
1497 | goto out; | ||
1498 | } | ||
1499 | |||
1500 | switch (vol_pg0.VolumeState) { | ||
1501 | case MPI2_RAID_VOL_STATE_OPTIMAL: | ||
1502 | case MPI2_RAID_VOL_STATE_ONLINE: | ||
1503 | state = RAID_STATE_ACTIVE; | ||
1504 | break; | ||
1505 | case MPI2_RAID_VOL_STATE_DEGRADED: | ||
1506 | state = RAID_STATE_DEGRADED; | ||
1507 | break; | ||
1508 | case MPI2_RAID_VOL_STATE_FAILED: | ||
1509 | case MPI2_RAID_VOL_STATE_MISSING: | ||
1510 | state = RAID_STATE_OFFLINE; | ||
1511 | break; | ||
1512 | } | ||
1513 | out: | ||
1514 | raid_set_state(mpt2sas_raid_template, dev, state); | ||
1515 | } | ||
1516 | |||
1517 | /** | ||
1518 | * _scsih_set_level - set raid level | ||
1519 | * @sdev: scsi device struct | ||
1520 | * @raid_device: raid_device object | ||
1521 | */ | ||
1522 | static void | ||
1523 | _scsih_set_level(struct scsi_device *sdev, struct _raid_device *raid_device) | ||
1524 | { | ||
1525 | enum raid_level level = RAID_LEVEL_UNKNOWN; | ||
1526 | |||
1527 | switch (raid_device->volume_type) { | ||
1528 | case MPI2_RAID_VOL_TYPE_RAID0: | ||
1529 | level = RAID_LEVEL_0; | ||
1530 | break; | ||
1531 | case MPI2_RAID_VOL_TYPE_RAID10: | ||
1532 | level = RAID_LEVEL_10; | ||
1533 | break; | ||
1534 | case MPI2_RAID_VOL_TYPE_RAID1E: | ||
1535 | level = RAID_LEVEL_1E; | ||
1536 | break; | ||
1537 | case MPI2_RAID_VOL_TYPE_RAID1: | ||
1538 | level = RAID_LEVEL_1; | ||
1539 | break; | ||
1540 | } | ||
1541 | |||
1542 | raid_set_level(mpt2sas_raid_template, &sdev->sdev_gendev, level); | ||
1543 | } | ||
1544 | |||
1545 | /** | ||
1422 | * _scsih_get_volume_capabilities - volume capabilities | 1546 | * _scsih_get_volume_capabilities - volume capabilities |
1423 | * @ioc: per adapter object | 1547 | * @ioc: per adapter object |
1424 | * @sas_device: the raid_device object | 1548 | * @sas_device: the raid_device object |
@@ -1479,6 +1603,32 @@ _scsih_get_volume_capabilities(struct MPT2SAS_ADAPTER *ioc, | |||
1479 | } | 1603 | } |
1480 | 1604 | ||
1481 | /** | 1605 | /** |
1606 | * _scsih_enable_tlr - setting TLR flags | ||
1607 | * @ioc: per adapter object | ||
1608 | * @sdev: scsi device struct | ||
1609 | * | ||
1610 | * Enabling Transaction Layer Retries for tape devices when | ||
1611 | * vpd page 0x90 is present | ||
1612 | * | ||
1613 | */ | ||
1614 | static void | ||
1615 | _scsih_enable_tlr(struct MPT2SAS_ADAPTER *ioc, struct scsi_device *sdev) | ||
1616 | { | ||
1617 | /* only for TAPE */ | ||
1618 | if (sdev->type != TYPE_TAPE) | ||
1619 | return; | ||
1620 | |||
1621 | if (!(ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR)) | ||
1622 | return; | ||
1623 | |||
1624 | sas_enable_tlr(sdev); | ||
1625 | sdev_printk(KERN_INFO, sdev, "TLR %s\n", | ||
1626 | sas_is_tlr_enabled(sdev) ? "Enabled" : "Disabled"); | ||
1627 | return; | ||
1628 | |||
1629 | } | ||
1630 | |||
1631 | /** | ||
1482 | * _scsih_slave_configure - device configure routine. | 1632 | * _scsih_slave_configure - device configure routine. |
1483 | * @sdev: scsi device struct | 1633 | * @sdev: scsi device struct |
1484 | * | 1634 | * |
@@ -1574,6 +1724,8 @@ _scsih_slave_configure(struct scsi_device *sdev) | |||
1574 | (unsigned long long)raid_device->wwid, | 1724 | (unsigned long long)raid_device->wwid, |
1575 | raid_device->num_pds, ds); | 1725 | raid_device->num_pds, ds); |
1576 | _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT); | 1726 | _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT); |
1727 | /* raid transport support */ | ||
1728 | _scsih_set_level(sdev, raid_device); | ||
1577 | return 0; | 1729 | return 0; |
1578 | } | 1730 | } |
1579 | 1731 | ||
@@ -1621,8 +1773,10 @@ _scsih_slave_configure(struct scsi_device *sdev) | |||
1621 | 1773 | ||
1622 | _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT); | 1774 | _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT); |
1623 | 1775 | ||
1624 | if (ssp_target) | 1776 | if (ssp_target) { |
1625 | sas_read_port_mode_page(sdev); | 1777 | sas_read_port_mode_page(sdev); |
1778 | _scsih_enable_tlr(ioc, sdev); | ||
1779 | } | ||
1626 | return 0; | 1780 | return 0; |
1627 | } | 1781 | } |
1628 | 1782 | ||
@@ -2908,8 +3062,9 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *)) | |||
2908 | 3062 | ||
2909 | } else | 3063 | } else |
2910 | mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; | 3064 | mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; |
2911 | 3065 | /* Make sure Device is not raid volume */ | |
2912 | if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON)) | 3066 | if (!_scsih_is_raid(&scmd->device->sdev_gendev) && |
3067 | sas_is_tlr_enabled(scmd->device)) | ||
2913 | mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON; | 3068 | mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON; |
2914 | 3069 | ||
2915 | smid = mpt2sas_base_get_smid_scsiio(ioc, ioc->scsi_io_cb_idx, scmd); | 3070 | smid = mpt2sas_base_get_smid_scsiio(ioc, ioc->scsi_io_cb_idx, scmd); |
@@ -3298,10 +3453,12 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) | |||
3298 | le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF; | 3453 | le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF; |
3299 | if (!sas_device_priv_data->tlr_snoop_check) { | 3454 | if (!sas_device_priv_data->tlr_snoop_check) { |
3300 | sas_device_priv_data->tlr_snoop_check++; | 3455 | sas_device_priv_data->tlr_snoop_check++; |
3301 | if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) && | 3456 | if (!_scsih_is_raid(&scmd->device->sdev_gendev) && |
3302 | response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME) | 3457 | sas_is_tlr_enabled(scmd->device) && |
3303 | sas_device_priv_data->flags &= | 3458 | response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME) { |
3304 | ~MPT_DEVICE_TLR_ON; | 3459 | sas_disable_tlr(scmd->device); |
3460 | sdev_printk(KERN_INFO, scmd->device, "TLR disabled\n"); | ||
3461 | } | ||
3305 | } | 3462 | } |
3306 | 3463 | ||
3307 | xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); | 3464 | xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); |
@@ -5170,11 +5327,33 @@ static void | |||
5170 | _scsih_sas_ir_operation_status_event(struct MPT2SAS_ADAPTER *ioc, | 5327 | _scsih_sas_ir_operation_status_event(struct MPT2SAS_ADAPTER *ioc, |
5171 | struct fw_event_work *fw_event) | 5328 | struct fw_event_work *fw_event) |
5172 | { | 5329 | { |
5330 | Mpi2EventDataIrOperationStatus_t *event_data = fw_event->event_data; | ||
5331 | static struct _raid_device *raid_device; | ||
5332 | unsigned long flags; | ||
5333 | u16 handle; | ||
5334 | |||
5173 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 5335 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
5174 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) | 5336 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) |
5175 | _scsih_sas_ir_operation_status_event_debug(ioc, | 5337 | _scsih_sas_ir_operation_status_event_debug(ioc, |
5176 | fw_event->event_data); | 5338 | event_data); |
5177 | #endif | 5339 | #endif |
5340 | |||
5341 | /* code added for raid transport support */ | ||
5342 | if (event_data->RAIDOperation == MPI2_EVENT_IR_RAIDOP_RESYNC) { | ||
5343 | |||
5344 | handle = le16_to_cpu(event_data->VolDevHandle); | ||
5345 | |||
5346 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | ||
5347 | raid_device = _scsih_raid_device_find_by_handle(ioc, handle); | ||
5348 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | ||
5349 | |||
5350 | if (!raid_device) | ||
5351 | return; | ||
5352 | |||
5353 | if (event_data->RAIDOperation == MPI2_EVENT_IR_RAIDOP_RESYNC) | ||
5354 | raid_device->percent_complete = | ||
5355 | event_data->PercentComplete; | ||
5356 | } | ||
5178 | } | 5357 | } |
5179 | 5358 | ||
5180 | /** | 5359 | /** |
@@ -5998,6 +6177,8 @@ _scsih_remove(struct pci_dev *pdev) | |||
5998 | struct _sas_port *mpt2sas_port; | 6177 | struct _sas_port *mpt2sas_port; |
5999 | struct _sas_device *sas_device; | 6178 | struct _sas_device *sas_device; |
6000 | struct _sas_node *expander_sibling; | 6179 | struct _sas_node *expander_sibling; |
6180 | struct _raid_device *raid_device, *next; | ||
6181 | struct MPT2SAS_TARGET *sas_target_priv_data; | ||
6001 | struct workqueue_struct *wq; | 6182 | struct workqueue_struct *wq; |
6002 | unsigned long flags; | 6183 | unsigned long flags; |
6003 | 6184 | ||
@@ -6011,6 +6192,21 @@ _scsih_remove(struct pci_dev *pdev) | |||
6011 | if (wq) | 6192 | if (wq) |
6012 | destroy_workqueue(wq); | 6193 | destroy_workqueue(wq); |
6013 | 6194 | ||
6195 | /* release all the volumes */ | ||
6196 | list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list, | ||
6197 | list) { | ||
6198 | if (raid_device->starget) { | ||
6199 | sas_target_priv_data = | ||
6200 | raid_device->starget->hostdata; | ||
6201 | sas_target_priv_data->deleted = 1; | ||
6202 | scsi_remove_target(&raid_device->starget->dev); | ||
6203 | } | ||
6204 | printk(MPT2SAS_INFO_FMT "removing handle(0x%04x), wwid" | ||
6205 | "(0x%016llx)\n", ioc->name, raid_device->handle, | ||
6206 | (unsigned long long) raid_device->wwid); | ||
6207 | _scsih_raid_device_remove(ioc, raid_device); | ||
6208 | } | ||
6209 | |||
6014 | /* free ports attached to the sas_host */ | 6210 | /* free ports attached to the sas_host */ |
6015 | retry_again: | 6211 | retry_again: |
6016 | list_for_each_entry(mpt2sas_port, | 6212 | list_for_each_entry(mpt2sas_port, |
@@ -6373,6 +6569,13 @@ static struct pci_driver scsih_driver = { | |||
6373 | #endif | 6569 | #endif |
6374 | }; | 6570 | }; |
6375 | 6571 | ||
6572 | /* raid transport support */ | ||
6573 | static struct raid_function_template mpt2sas_raid_functions = { | ||
6574 | .cookie = &scsih_driver_template, | ||
6575 | .is_raid = _scsih_is_raid, | ||
6576 | .get_resync = _scsih_get_resync, | ||
6577 | .get_state = _scsih_get_state, | ||
6578 | }; | ||
6376 | 6579 | ||
6377 | /** | 6580 | /** |
6378 | * _scsih_init - main entry point for this driver. | 6581 | * _scsih_init - main entry point for this driver. |
@@ -6392,6 +6595,12 @@ _scsih_init(void) | |||
6392 | sas_attach_transport(&mpt2sas_transport_functions); | 6595 | sas_attach_transport(&mpt2sas_transport_functions); |
6393 | if (!mpt2sas_transport_template) | 6596 | if (!mpt2sas_transport_template) |
6394 | return -ENODEV; | 6597 | return -ENODEV; |
6598 | /* raid transport support */ | ||
6599 | mpt2sas_raid_template = raid_class_attach(&mpt2sas_raid_functions); | ||
6600 | if (!mpt2sas_raid_template) { | ||
6601 | sas_release_transport(mpt2sas_transport_template); | ||
6602 | return -ENODEV; | ||
6603 | } | ||
6395 | 6604 | ||
6396 | mpt2sas_base_initialize_callback_handler(); | 6605 | mpt2sas_base_initialize_callback_handler(); |
6397 | 6606 | ||
@@ -6426,8 +6635,11 @@ _scsih_init(void) | |||
6426 | mpt2sas_ctl_init(); | 6635 | mpt2sas_ctl_init(); |
6427 | 6636 | ||
6428 | error = pci_register_driver(&scsih_driver); | 6637 | error = pci_register_driver(&scsih_driver); |
6429 | if (error) | 6638 | if (error) { |
6639 | /* raid transport support */ | ||
6640 | raid_class_release(mpt2sas_raid_template); | ||
6430 | sas_release_transport(mpt2sas_transport_template); | 6641 | sas_release_transport(mpt2sas_transport_template); |
6642 | } | ||
6431 | 6643 | ||
6432 | return error; | 6644 | return error; |
6433 | } | 6645 | } |
@@ -6445,7 +6657,8 @@ _scsih_exit(void) | |||
6445 | 6657 | ||
6446 | pci_unregister_driver(&scsih_driver); | 6658 | pci_unregister_driver(&scsih_driver); |
6447 | 6659 | ||
6448 | sas_release_transport(mpt2sas_transport_template); | 6660 | mpt2sas_ctl_exit(); |
6661 | |||
6449 | mpt2sas_base_release_callback_handler(scsi_io_cb_idx); | 6662 | mpt2sas_base_release_callback_handler(scsi_io_cb_idx); |
6450 | mpt2sas_base_release_callback_handler(tm_cb_idx); | 6663 | mpt2sas_base_release_callback_handler(tm_cb_idx); |
6451 | mpt2sas_base_release_callback_handler(base_cb_idx); | 6664 | mpt2sas_base_release_callback_handler(base_cb_idx); |
@@ -6457,7 +6670,10 @@ _scsih_exit(void) | |||
6457 | mpt2sas_base_release_callback_handler(tm_tr_cb_idx); | 6670 | mpt2sas_base_release_callback_handler(tm_tr_cb_idx); |
6458 | mpt2sas_base_release_callback_handler(tm_sas_control_cb_idx); | 6671 | mpt2sas_base_release_callback_handler(tm_sas_control_cb_idx); |
6459 | 6672 | ||
6460 | mpt2sas_ctl_exit(); | 6673 | /* raid transport support */ |
6674 | raid_class_release(mpt2sas_raid_template); | ||
6675 | sas_release_transport(mpt2sas_transport_template); | ||
6676 | |||
6461 | } | 6677 | } |
6462 | 6678 | ||
6463 | module_init(_scsih_init); | 6679 | module_init(_scsih_init); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c index 3a82872bad44..789f9ee7f001 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c | |||
@@ -855,6 +855,17 @@ rphy_to_ioc(struct sas_rphy *rphy) | |||
855 | return shost_priv(shost); | 855 | return shost_priv(shost); |
856 | } | 856 | } |
857 | 857 | ||
858 | static struct _sas_phy * | ||
859 | _transport_find_local_phy(struct MPT2SAS_ADAPTER *ioc, struct sas_phy *phy) | ||
860 | { | ||
861 | int i; | ||
862 | |||
863 | for (i = 0; i < ioc->sas_hba.num_phys; i++) | ||
864 | if (ioc->sas_hba.phy[i].phy == phy) | ||
865 | return(&ioc->sas_hba.phy[i]); | ||
866 | return NULL; | ||
867 | } | ||
868 | |||
858 | /** | 869 | /** |
859 | * _transport_get_linkerrors - | 870 | * _transport_get_linkerrors - |
860 | * @phy: The sas phy object | 871 | * @phy: The sas phy object |
@@ -870,14 +881,8 @@ _transport_get_linkerrors(struct sas_phy *phy) | |||
870 | struct _sas_phy *mpt2sas_phy; | 881 | struct _sas_phy *mpt2sas_phy; |
871 | Mpi2ConfigReply_t mpi_reply; | 882 | Mpi2ConfigReply_t mpi_reply; |
872 | Mpi2SasPhyPage1_t phy_pg1; | 883 | Mpi2SasPhyPage1_t phy_pg1; |
873 | int i; | ||
874 | 884 | ||
875 | for (i = 0, mpt2sas_phy = NULL; i < ioc->sas_hba.num_phys && | 885 | mpt2sas_phy = _transport_find_local_phy(ioc, phy); |
876 | !mpt2sas_phy; i++) { | ||
877 | if (ioc->sas_hba.phy[i].phy != phy) | ||
878 | continue; | ||
879 | mpt2sas_phy = &ioc->sas_hba.phy[i]; | ||
880 | } | ||
881 | 886 | ||
882 | if (!mpt2sas_phy) /* this phy not on sas_host */ | 887 | if (!mpt2sas_phy) /* this phy not on sas_host */ |
883 | return -EINVAL; | 888 | return -EINVAL; |
@@ -971,14 +976,8 @@ _transport_phy_reset(struct sas_phy *phy, int hard_reset) | |||
971 | struct _sas_phy *mpt2sas_phy; | 976 | struct _sas_phy *mpt2sas_phy; |
972 | Mpi2SasIoUnitControlReply_t mpi_reply; | 977 | Mpi2SasIoUnitControlReply_t mpi_reply; |
973 | Mpi2SasIoUnitControlRequest_t mpi_request; | 978 | Mpi2SasIoUnitControlRequest_t mpi_request; |
974 | int i; | ||
975 | 979 | ||
976 | for (i = 0, mpt2sas_phy = NULL; i < ioc->sas_hba.num_phys && | 980 | mpt2sas_phy = _transport_find_local_phy(ioc, phy); |
977 | !mpt2sas_phy; i++) { | ||
978 | if (ioc->sas_hba.phy[i].phy != phy) | ||
979 | continue; | ||
980 | mpt2sas_phy = &ioc->sas_hba.phy[i]; | ||
981 | } | ||
982 | 981 | ||
983 | if (!mpt2sas_phy) /* this phy not on sas_host */ | 982 | if (!mpt2sas_phy) /* this phy not on sas_host */ |
984 | return -EINVAL; | 983 | return -EINVAL; |
@@ -1006,6 +1005,173 @@ _transport_phy_reset(struct sas_phy *phy, int hard_reset) | |||
1006 | } | 1005 | } |
1007 | 1006 | ||
1008 | /** | 1007 | /** |
1008 | * _transport_phy_enable - enable/disable phys | ||
1009 | * @phy: The sas phy object | ||
1010 | * @enable: enable phy when true | ||
1011 | * | ||
1012 | * Only support sas_host direct attached phys. | ||
1013 | * Returns 0 for success, non-zero for failure. | ||
1014 | */ | ||
1015 | static int | ||
1016 | _transport_phy_enable(struct sas_phy *phy, int enable) | ||
1017 | { | ||
1018 | struct MPT2SAS_ADAPTER *ioc = phy_to_ioc(phy); | ||
1019 | struct _sas_phy *mpt2sas_phy; | ||
1020 | Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL; | ||
1021 | Mpi2ConfigReply_t mpi_reply; | ||
1022 | u16 ioc_status; | ||
1023 | u16 sz; | ||
1024 | int rc = 0; | ||
1025 | |||
1026 | mpt2sas_phy = _transport_find_local_phy(ioc, phy); | ||
1027 | |||
1028 | if (!mpt2sas_phy) /* this phy not on sas_host */ | ||
1029 | return -EINVAL; | ||
1030 | |||
1031 | /* sas_iounit page 1 */ | ||
1032 | sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData) + (ioc->sas_hba.num_phys * | ||
1033 | sizeof(Mpi2SasIOUnit1PhyData_t)); | ||
1034 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ||
1035 | if (!sas_iounit_pg1) { | ||
1036 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1037 | ioc->name, __FILE__, __LINE__, __func__); | ||
1038 | rc = -ENOMEM; | ||
1039 | goto out; | ||
1040 | } | ||
1041 | if ((mpt2sas_config_get_sas_iounit_pg1(ioc, &mpi_reply, | ||
1042 | sas_iounit_pg1, sz))) { | ||
1043 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1044 | ioc->name, __FILE__, __LINE__, __func__); | ||
1045 | rc = -ENXIO; | ||
1046 | goto out; | ||
1047 | } | ||
1048 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
1049 | MPI2_IOCSTATUS_MASK; | ||
1050 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
1051 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1052 | ioc->name, __FILE__, __LINE__, __func__); | ||
1053 | rc = -EIO; | ||
1054 | goto out; | ||
1055 | } | ||
1056 | |||
1057 | if (enable) | ||
1058 | sas_iounit_pg1->PhyData[mpt2sas_phy->phy_id].PhyFlags | ||
1059 | &= ~MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; | ||
1060 | else | ||
1061 | sas_iounit_pg1->PhyData[mpt2sas_phy->phy_id].PhyFlags | ||
1062 | |= MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; | ||
1063 | |||
1064 | mpt2sas_config_set_sas_iounit_pg1(ioc, &mpi_reply, sas_iounit_pg1, sz); | ||
1065 | |||
1066 | out: | ||
1067 | kfree(sas_iounit_pg1); | ||
1068 | return rc; | ||
1069 | } | ||
1070 | |||
1071 | /** | ||
1072 | * _transport_phy_speed - set phy min/max link rates | ||
1073 | * @phy: The sas phy object | ||
1074 | * @rates: rates defined in sas_phy_linkrates | ||
1075 | * | ||
1076 | * Only support sas_host direct attached phys. | ||
1077 | * Returns 0 for success, non-zero for failure. | ||
1078 | */ | ||
1079 | static int | ||
1080 | _transport_phy_speed(struct sas_phy *phy, struct sas_phy_linkrates *rates) | ||
1081 | { | ||
1082 | struct MPT2SAS_ADAPTER *ioc = phy_to_ioc(phy); | ||
1083 | struct _sas_phy *mpt2sas_phy; | ||
1084 | Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL; | ||
1085 | Mpi2SasPhyPage0_t phy_pg0; | ||
1086 | Mpi2ConfigReply_t mpi_reply; | ||
1087 | u16 ioc_status; | ||
1088 | u16 sz; | ||
1089 | int i; | ||
1090 | int rc = 0; | ||
1091 | |||
1092 | mpt2sas_phy = _transport_find_local_phy(ioc, phy); | ||
1093 | |||
1094 | if (!mpt2sas_phy) /* this phy not on sas_host */ | ||
1095 | return -EINVAL; | ||
1096 | |||
1097 | if (!rates->minimum_linkrate) | ||
1098 | rates->minimum_linkrate = phy->minimum_linkrate; | ||
1099 | else if (rates->minimum_linkrate < phy->minimum_linkrate_hw) | ||
1100 | rates->minimum_linkrate = phy->minimum_linkrate_hw; | ||
1101 | |||
1102 | if (!rates->maximum_linkrate) | ||
1103 | rates->maximum_linkrate = phy->maximum_linkrate; | ||
1104 | else if (rates->maximum_linkrate > phy->maximum_linkrate_hw) | ||
1105 | rates->maximum_linkrate = phy->maximum_linkrate_hw; | ||
1106 | |||
1107 | /* sas_iounit page 1 */ | ||
1108 | sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData) + (ioc->sas_hba.num_phys * | ||
1109 | sizeof(Mpi2SasIOUnit1PhyData_t)); | ||
1110 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ||
1111 | if (!sas_iounit_pg1) { | ||
1112 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1113 | ioc->name, __FILE__, __LINE__, __func__); | ||
1114 | rc = -ENOMEM; | ||
1115 | goto out; | ||
1116 | } | ||
1117 | if ((mpt2sas_config_get_sas_iounit_pg1(ioc, &mpi_reply, | ||
1118 | sas_iounit_pg1, sz))) { | ||
1119 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1120 | ioc->name, __FILE__, __LINE__, __func__); | ||
1121 | rc = -ENXIO; | ||
1122 | goto out; | ||
1123 | } | ||
1124 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
1125 | MPI2_IOCSTATUS_MASK; | ||
1126 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
1127 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1128 | ioc->name, __FILE__, __LINE__, __func__); | ||
1129 | rc = -EIO; | ||
1130 | goto out; | ||
1131 | } | ||
1132 | |||
1133 | for (i = 0; i < ioc->sas_hba.num_phys; i++) { | ||
1134 | if (mpt2sas_phy->phy_id != i) { | ||
1135 | sas_iounit_pg1->PhyData[i].MaxMinLinkRate = | ||
1136 | (ioc->sas_hba.phy[i].phy->minimum_linkrate + | ||
1137 | (ioc->sas_hba.phy[i].phy->maximum_linkrate << 4)); | ||
1138 | } else { | ||
1139 | sas_iounit_pg1->PhyData[i].MaxMinLinkRate = | ||
1140 | (rates->minimum_linkrate + | ||
1141 | (rates->maximum_linkrate << 4)); | ||
1142 | } | ||
1143 | } | ||
1144 | |||
1145 | if (mpt2sas_config_set_sas_iounit_pg1(ioc, &mpi_reply, sas_iounit_pg1, | ||
1146 | sz)) { | ||
1147 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
1148 | ioc->name, __FILE__, __LINE__, __func__); | ||
1149 | rc = -ENXIO; | ||
1150 | goto out; | ||
1151 | } | ||
1152 | |||
1153 | /* link reset */ | ||
1154 | _transport_phy_reset(phy, 0); | ||
1155 | |||
1156 | /* read phy page 0, then update the rates in the sas transport phy */ | ||
1157 | if (!mpt2sas_config_get_phy_pg0(ioc, &mpi_reply, &phy_pg0, | ||
1158 | mpt2sas_phy->phy_id)) { | ||
1159 | phy->minimum_linkrate = _transport_convert_phy_link_rate( | ||
1160 | phy_pg0.ProgrammedLinkRate & MPI2_SAS_PRATE_MIN_RATE_MASK); | ||
1161 | phy->maximum_linkrate = _transport_convert_phy_link_rate( | ||
1162 | phy_pg0.ProgrammedLinkRate >> 4); | ||
1163 | phy->negotiated_linkrate = _transport_convert_phy_link_rate( | ||
1164 | phy_pg0.NegotiatedLinkRate & | ||
1165 | MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL); | ||
1166 | } | ||
1167 | |||
1168 | out: | ||
1169 | kfree(sas_iounit_pg1); | ||
1170 | return rc; | ||
1171 | } | ||
1172 | |||
1173 | |||
1174 | /** | ||
1009 | * _transport_smp_handler - transport portal for smp passthru | 1175 | * _transport_smp_handler - transport portal for smp passthru |
1010 | * @shost: shost object | 1176 | * @shost: shost object |
1011 | * @rphy: sas transport rphy object | 1177 | * @rphy: sas transport rphy object |
@@ -1207,6 +1373,8 @@ struct sas_function_template mpt2sas_transport_functions = { | |||
1207 | .get_enclosure_identifier = _transport_get_enclosure_identifier, | 1373 | .get_enclosure_identifier = _transport_get_enclosure_identifier, |
1208 | .get_bay_identifier = _transport_get_bay_identifier, | 1374 | .get_bay_identifier = _transport_get_bay_identifier, |
1209 | .phy_reset = _transport_phy_reset, | 1375 | .phy_reset = _transport_phy_reset, |
1376 | .phy_enable = _transport_phy_enable, | ||
1377 | .set_phy_speed = _transport_phy_speed, | ||
1210 | .smp_handler = _transport_smp_handler, | 1378 | .smp_handler = _transport_smp_handler, |
1211 | }; | 1379 | }; |
1212 | 1380 | ||