diff options
-rw-r--r-- | drivers/message/fusion/mptsas.c | 226 |
1 files changed, 153 insertions, 73 deletions
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 7de19a84dc74..6512027bc69a 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -123,6 +123,101 @@ struct mptsas_portinfo { | |||
123 | struct mptsas_phyinfo *phy_info; | 123 | struct mptsas_phyinfo *phy_info; |
124 | }; | 124 | }; |
125 | 125 | ||
126 | |||
127 | #ifdef SASDEBUG | ||
128 | static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) | ||
129 | { | ||
130 | printk("---- IO UNIT PAGE 0 ------------\n"); | ||
131 | printk("Handle=0x%X\n", | ||
132 | le16_to_cpu(phy_data->AttachedDeviceHandle)); | ||
133 | printk("Controller Handle=0x%X\n", | ||
134 | le16_to_cpu(phy_data->ControllerDevHandle)); | ||
135 | printk("Port=0x%X\n", phy_data->Port); | ||
136 | printk("Port Flags=0x%X\n", phy_data->PortFlags); | ||
137 | printk("PHY Flags=0x%X\n", phy_data->PhyFlags); | ||
138 | printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); | ||
139 | printk("Controller PHY Device Info=0x%X\n", | ||
140 | le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); | ||
141 | printk("DiscoveryStatus=0x%X\n", | ||
142 | le32_to_cpu(phy_data->DiscoveryStatus)); | ||
143 | printk("\n"); | ||
144 | } | ||
145 | |||
146 | static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) | ||
147 | { | ||
148 | __le64 sas_address; | ||
149 | |||
150 | memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); | ||
151 | |||
152 | printk("---- SAS PHY PAGE 0 ------------\n"); | ||
153 | printk("Attached Device Handle=0x%X\n", | ||
154 | le16_to_cpu(pg0->AttachedDevHandle)); | ||
155 | printk("SAS Address=0x%llX\n", | ||
156 | (unsigned long long)le64_to_cpu(sas_address)); | ||
157 | printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); | ||
158 | printk("Attached Device Info=0x%X\n", | ||
159 | le32_to_cpu(pg0->AttachedDeviceInfo)); | ||
160 | printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); | ||
161 | printk("Change Count=0x%X\n", pg0->ChangeCount); | ||
162 | printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); | ||
163 | printk("\n"); | ||
164 | } | ||
165 | |||
166 | static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1) | ||
167 | { | ||
168 | printk("---- SAS PHY PAGE 1 ------------\n"); | ||
169 | printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount); | ||
170 | printk("Running Disparity Error Count=0x%x\n", | ||
171 | pg1->RunningDisparityErrorCount); | ||
172 | printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount); | ||
173 | printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount); | ||
174 | printk("\n"); | ||
175 | } | ||
176 | |||
177 | static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) | ||
178 | { | ||
179 | __le64 sas_address; | ||
180 | |||
181 | memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); | ||
182 | |||
183 | printk("---- SAS DEVICE PAGE 0 ---------\n"); | ||
184 | printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); | ||
185 | printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); | ||
186 | printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); | ||
187 | printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); | ||
188 | printk("Target ID=0x%X\n", pg0->TargetID); | ||
189 | printk("Bus=0x%X\n", pg0->Bus); | ||
190 | printk("PhyNum=0x%X\n", pg0->PhyNum); | ||
191 | printk("AccessStatus=0x%X\n", le16_to_cpu(pg0->AccessStatus)); | ||
192 | printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); | ||
193 | printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); | ||
194 | printk("Physical Port=0x%X\n", pg0->PhysicalPort); | ||
195 | printk("\n"); | ||
196 | } | ||
197 | |||
198 | static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) | ||
199 | { | ||
200 | printk("---- SAS EXPANDER PAGE 1 ------------\n"); | ||
201 | |||
202 | printk("Physical Port=0x%X\n", pg1->PhysicalPort); | ||
203 | printk("PHY Identifier=0x%X\n", pg1->Phy); | ||
204 | printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); | ||
205 | printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); | ||
206 | printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); | ||
207 | printk("Owner Device Handle=0x%X\n", | ||
208 | le16_to_cpu(pg1->OwnerDevHandle)); | ||
209 | printk("Attached Device Handle=0x%X\n", | ||
210 | le16_to_cpu(pg1->AttachedDevHandle)); | ||
211 | } | ||
212 | #else | ||
213 | #define mptsas_print_phy_data(phy_data) do { } while (0) | ||
214 | #define mptsas_print_phy_pg0(pg0) do { } while (0) | ||
215 | #define mptsas_print_phy_pg1(pg1) do { } while (0) | ||
216 | #define mptsas_print_device_pg0(pg0) do { } while (0) | ||
217 | #define mptsas_print_expander_pg1(pg1) do { } while (0) | ||
218 | #endif | ||
219 | |||
220 | |||
126 | /* | 221 | /* |
127 | * This is pretty ugly. We will be able to seriously clean it up | 222 | * This is pretty ugly. We will be able to seriously clean it up |
128 | * once the DV code in mptscsih goes away and we can properly | 223 | * once the DV code in mptscsih goes away and we can properly |
@@ -200,91 +295,76 @@ static struct scsi_host_template mptsas_driver_template = { | |||
200 | .use_clustering = ENABLE_CLUSTERING, | 295 | .use_clustering = ENABLE_CLUSTERING, |
201 | }; | 296 | }; |
202 | 297 | ||
203 | static struct sas_function_template mptsas_transport_functions = { | 298 | static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) |
204 | }; | ||
205 | |||
206 | static struct scsi_transport_template *mptsas_transport_template; | ||
207 | |||
208 | #ifdef SASDEBUG | ||
209 | static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) | ||
210 | { | 299 | { |
211 | printk("---- IO UNIT PAGE 0 ------------\n"); | 300 | struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); |
212 | printk("Handle=0x%X\n", | 301 | return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; |
213 | le16_to_cpu(phy_data->AttachedDeviceHandle)); | ||
214 | printk("Controller Handle=0x%X\n", | ||
215 | le16_to_cpu(phy_data->ControllerDevHandle)); | ||
216 | printk("Port=0x%X\n", phy_data->Port); | ||
217 | printk("Port Flags=0x%X\n", phy_data->PortFlags); | ||
218 | printk("PHY Flags=0x%X\n", phy_data->PhyFlags); | ||
219 | printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); | ||
220 | printk("Controller PHY Device Info=0x%X\n", | ||
221 | le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); | ||
222 | printk("DiscoveryStatus=0x%X\n", | ||
223 | le32_to_cpu(phy_data->DiscoveryStatus)); | ||
224 | printk("\n"); | ||
225 | } | 302 | } |
226 | 303 | ||
227 | static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) | 304 | static int mptsas_get_linkerrors(struct sas_phy *phy) |
228 | { | 305 | { |
229 | __le64 sas_address; | 306 | MPT_ADAPTER *ioc = phy_to_ioc(phy); |
307 | ConfigExtendedPageHeader_t hdr; | ||
308 | CONFIGPARMS cfg; | ||
309 | SasPhyPage1_t *buffer; | ||
310 | dma_addr_t dma_handle; | ||
311 | int error; | ||
230 | 312 | ||
231 | memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); | 313 | hdr.PageVersion = MPI_SASPHY1_PAGEVERSION; |
314 | hdr.ExtPageLength = 0; | ||
315 | hdr.PageNumber = 1 /* page number 1*/; | ||
316 | hdr.Reserved1 = 0; | ||
317 | hdr.Reserved2 = 0; | ||
318 | hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; | ||
319 | hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY; | ||
232 | 320 | ||
233 | printk("---- SAS PHY PAGE 0 ------------\n"); | 321 | cfg.cfghdr.ehdr = &hdr; |
234 | printk("Attached Device Handle=0x%X\n", | 322 | cfg.physAddr = -1; |
235 | le16_to_cpu(pg0->AttachedDevHandle)); | 323 | cfg.pageAddr = phy->identify.phy_identifier; |
236 | printk("SAS Address=0x%llX\n", | 324 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
237 | (unsigned long long)le64_to_cpu(sas_address)); | 325 | cfg.dir = 0; /* read */ |
238 | printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); | 326 | cfg.timeout = 10; |
239 | printk("Attached Device Info=0x%X\n", | ||
240 | le32_to_cpu(pg0->AttachedDeviceInfo)); | ||
241 | printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); | ||
242 | printk("Change Count=0x%X\n", pg0->ChangeCount); | ||
243 | printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); | ||
244 | printk("\n"); | ||
245 | } | ||
246 | 327 | ||
247 | static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) | 328 | error = mpt_config(ioc, &cfg); |
248 | { | 329 | if (error) |
249 | __le64 sas_address; | 330 | return error; |
331 | if (!hdr.ExtPageLength) | ||
332 | return -ENXIO; | ||
250 | 333 | ||
251 | memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); | 334 | buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4, |
335 | &dma_handle); | ||
336 | if (!buffer) | ||
337 | return -ENOMEM; | ||
252 | 338 | ||
253 | printk("---- SAS DEVICE PAGE 0 ---------\n"); | 339 | cfg.physAddr = dma_handle; |
254 | printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); | 340 | cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; |
255 | printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); | ||
256 | printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); | ||
257 | printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); | ||
258 | printk("Target ID=0x%X\n", pg0->TargetID); | ||
259 | printk("Bus=0x%X\n", pg0->Bus); | ||
260 | printk("Parent Phy Num=0x%X\n", pg0->PhyNum); | ||
261 | printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); | ||
262 | printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); | ||
263 | printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); | ||
264 | printk("Physical Port=0x%X\n", pg0->PhysicalPort); | ||
265 | printk("\n"); | ||
266 | } | ||
267 | 341 | ||
268 | static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) | 342 | error = mpt_config(ioc, &cfg); |
269 | { | 343 | if (error) |
270 | printk("---- SAS EXPANDER PAGE 1 ------------\n"); | 344 | goto out_free_consistent; |
271 | 345 | ||
272 | printk("Physical Port=0x%X\n", pg1->PhysicalPort); | 346 | mptsas_print_phy_pg1(buffer); |
273 | printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); | 347 | |
274 | printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); | 348 | phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount); |
275 | printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); | 349 | phy->running_disparity_error_count = |
276 | printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); | 350 | le32_to_cpu(buffer->RunningDisparityErrorCount); |
277 | printk("Owner Device Handle=0x%X\n", | 351 | phy->loss_of_dword_sync_count = |
278 | le16_to_cpu(pg1->OwnerDevHandle)); | 352 | le32_to_cpu(buffer->LossDwordSynchCount); |
279 | printk("Attached Device Handle=0x%X\n", | 353 | phy->phy_reset_problem_count = |
280 | le16_to_cpu(pg1->AttachedDevHandle)); | 354 | le32_to_cpu(buffer->PhyResetProblemCount); |
355 | |||
356 | out_free_consistent: | ||
357 | pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, | ||
358 | buffer, dma_handle); | ||
359 | return error; | ||
281 | } | 360 | } |
282 | #else | 361 | |
283 | #define mptsas_print_phy_data(phy_data) do { } while (0) | 362 | |
284 | #define mptsas_print_phy_pg0(pg0) do { } while (0) | 363 | static struct sas_function_template mptsas_transport_functions = { |
285 | #define mptsas_print_device_pg0(pg0) do { } while (0) | 364 | .get_linkerrors = mptsas_get_linkerrors, |
286 | #define mptsas_print_expander_pg1(pg1) do { } while (0) | 365 | }; |
287 | #endif | 366 | |
367 | static struct scsi_transport_template *mptsas_transport_template; | ||
288 | 368 | ||
289 | static int | 369 | static int |
290 | mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) | 370 | mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) |