Deleted Added
full compact
oce_sysctl.c (252869) oce_sysctl.c (257007)
1/*-
2 * Copyright (C) 2013 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,

--- 22 unchanged lines hidden (view full) ---

31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
1/*-
2 * Copyright (C) 2013 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,

--- 22 unchanged lines hidden (view full) ---

31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
39/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 252869 2013-07-06 08:30:45Z delphij $ */
39/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 257007 2013-10-23 18:58:38Z delphij $ */
40
40
41
42#include "oce_if.h"
43
44static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
45static void copy_stats_to_sc_be3(POCE_SOFTC sc);
46static void copy_stats_to_sc_be2(POCE_SOFTC sc);
47static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
48static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
41#include "oce_if.h"
42
43static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
44static void copy_stats_to_sc_be3(POCE_SOFTC sc);
45static void copy_stats_to_sc_be2(POCE_SOFTC sc);
46static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
47static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
48static int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
49static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
49static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
50static int oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
51 *fw, int num_imgs);
52static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
53static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
54static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
55static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
56 int img_optype, uint32_t img_offset,
57 uint32_t img_size, uint32_t hdrs_size);
58static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
59 struct sysctl_ctx_list *ctx,
60 struct sysctl_oid *stats_node);
61static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
62 struct sysctl_ctx_list *ctx,
63 struct sysctl_oid *stats_node);
64
50static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
51static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
52static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
53static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
54 int img_optype, uint32_t img_offset,
55 uint32_t img_size, uint32_t hdrs_size);
56static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
57 struct sysctl_ctx_list *ctx,
58 struct sysctl_oid *stats_node);
59static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
60 struct sysctl_ctx_list *ctx,
61 struct sysctl_oid *stats_node);
62
63
65extern char component_revision[32];
66uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
67
64extern char component_revision[32];
65uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
66
67struct flash_img_attri {
68 int img_offset;
69 int img_size;
70 int img_type;
71 bool skip_image;
72 int optype;
73};
74
68void
69oce_add_sysctls(POCE_SOFTC sc)
70{
71
72 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
73 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
74 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
75 struct sysctl_oid *stats_node;

--- 73 unchanged lines hidden (view full) ---

149}
150
151
152static uint32_t
153oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
154{
155 uint32_t status = 0;
156
75void
76oce_add_sysctls(POCE_SOFTC sc)
77{
78
79 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
80 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
81 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
82 struct sysctl_oid *stats_node;

--- 73 unchanged lines hidden (view full) ---

156}
157
158
159static uint32_t
160oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
161{
162 uint32_t status = 0;
163
157 oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
158 status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
164 oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1);
165 status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type,
159 1500, 2, 0xabc);
166 1500, 2, 0xabc);
160 oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
167 oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1);
161
162 return status;
163}
164
165static int
166oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
167{
168 int value = 0;

--- 49 unchanged lines hidden (view full) ---

218
219 fw = firmware_get(ufiname);
220 if (fw == NULL) {
221 device_printf(sc->dev, "Unable to get Firmware. "
222 "Make sure %s is copied to /boot/modules\n", ufiname);
223 return ENOENT;
224 }
225
168
169 return status;
170}
171
172static int
173oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
174{
175 int value = 0;

--- 49 unchanged lines hidden (view full) ---

225
226 fw = firmware_get(ufiname);
227 if (fw == NULL) {
228 device_printf(sc->dev, "Unable to get Firmware. "
229 "Make sure %s is copied to /boot/modules\n", ufiname);
230 return ENOENT;
231 }
232
226 if (IS_BE(sc) || IS_SH(sc)) {
233 if (IS_BE(sc)) {
227 if ((sc->flags & OCE_FLAGS_BE2)) {
228 device_printf(sc->dev,
229 "Flashing not supported for BE2 yet.\n");
230 status = 1;
231 goto done;
232 }
233 status = oce_be3_fwupgrade(sc, fw);
234 if ((sc->flags & OCE_FLAGS_BE2)) {
235 device_printf(sc->dev,
236 "Flashing not supported for BE2 yet.\n");
237 status = 1;
238 goto done;
239 }
240 status = oce_be3_fwupgrade(sc, fw);
241 } else if (IS_SH(sc)) {
242 status = oce_skyhawk_fwupgrade(sc,fw);
234 } else
235 status = oce_lancer_fwupgrade(sc, fw);
236done:
237 if (status) {
238 device_printf(sc->dev, "Firmware Upgrade failed\n");
239 } else {
240 device_printf(sc->dev, "Firmware Flashed successfully\n");
241 }
242
243 /* Release Firmware*/
244 firmware_put(fw, FIRMWARE_UNLOAD);
245
246 return status;
247}
248
243 } else
244 status = oce_lancer_fwupgrade(sc, fw);
245done:
246 if (status) {
247 device_printf(sc->dev, "Firmware Upgrade failed\n");
248 } else {
249 device_printf(sc->dev, "Firmware Flashed successfully\n");
250 }
251
252 /* Release Firmware*/
253 firmware_put(fw, FIRMWARE_UNLOAD);
254
255 return status;
256}
257
249
250static int
251oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
258static void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec,
259 struct flash_img_attri *pimg, int i,
260 const struct firmware *fw, int bin_offset)
252{
261{
253 int rc = 0, num_imgs = 0, i = 0;
254 const struct flash_file_hdr *fhdr;
255 const struct image_hdr *img_ptr;
256
257 fhdr = (const struct flash_file_hdr *)fw->data;
258 if (fhdr->build[0] != '3') {
259 device_printf(sc->dev, "Invalid BE3 firmware image\n");
260 return EINVAL;
262 if (IS_SH(sc)) {
263 pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset);
264 pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size);
261 }
265 }
262 /* Display flash version */
263 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
264
266
265 num_imgs = fhdr->num_imgs;
266 for (i = 0; i < num_imgs; i++) {
267 img_ptr = (const struct image_hdr *)((const char *)fw->data +
268 sizeof(struct flash_file_hdr) +
269 (i * sizeof(struct image_hdr)));
270 if (img_ptr->imageid == 1) {
271 rc = oce_be3_flashdata(sc, fw, num_imgs);
267 pimg->img_type = HOST_32(fsec->fsec_entry[i].type);
268 pimg->skip_image = FALSE;
269 switch (pimg->img_type) {
270 case IMG_ISCSI:
271 pimg->optype = 0;
272 if (IS_BE3(sc)) {
273 pimg->img_offset = 2097152;
274 pimg->img_size = 2097152;
275 }
272 break;
276 break;
273 }
277 case IMG_REDBOOT:
278 pimg->optype = 1;
279 if (IS_BE3(sc)) {
280 pimg->img_offset = 262144;
281 pimg->img_size = 1048576;
282 }
283 if (!oce_img_flashing_required(sc, fw->data,
284 pimg->optype,
285 pimg->img_offset,
286 pimg->img_size,
287 bin_offset))
288 pimg->skip_image = TRUE;
289 break;
290 case IMG_BIOS:
291 pimg->optype = 2;
292 if (IS_BE3(sc)) {
293 pimg->img_offset = 12582912;
294 pimg->img_size = 524288;
295 }
296 break;
297 case IMG_PXEBIOS:
298 pimg->optype = 3;
299 if (IS_BE3(sc)) {
300 pimg->img_offset = 13107200;;
301 pimg->img_size = 524288;
302 }
303 break;
304 case IMG_FCOEBIOS:
305 pimg->optype = 8;
306 if (IS_BE3(sc)) {
307 pimg->img_offset = 13631488;
308 pimg->img_size = 524288;
309 }
310 break;
311 case IMG_ISCSI_BAK:
312 pimg->optype = 9;
313 if (IS_BE3(sc)) {
314 pimg->img_offset = 4194304;
315 pimg->img_size = 2097152;
316 }
317 break;
318 case IMG_FCOE:
319 pimg->optype = 10;
320 if (IS_BE3(sc)) {
321 pimg->img_offset = 6291456;
322 pimg->img_size = 2097152;
323 }
324 break;
325 case IMG_FCOE_BAK:
326 pimg->optype = 11;
327 if (IS_BE3(sc)) {
328 pimg->img_offset = 8388608;
329 pimg->img_size = 2097152;
330 }
331 break;
332 case IMG_NCSI:
333 pimg->optype = 13;
334 if (IS_BE3(sc)) {
335 pimg->img_offset = 15990784;
336 pimg->img_size = 262144;
337 }
338 break;
339 case IMG_PHY:
340 pimg->optype = 99;
341 if (IS_BE3(sc)) {
342 pimg->img_offset = 1310720;
343 pimg->img_size = 262144;
344 }
345 if (!oce_phy_flashing_required(sc))
346 pimg->skip_image = TRUE;
347 break;
348 default:
349 pimg->skip_image = TRUE;
350 break;
274 }
275
351 }
352
276 return rc;
277}
278
353}
354
279
280static int
355static int
281oce_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int num_imgs)
356oce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs)
282{
283 char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "};
284 const char *p = (const char *)fw->data;
285 const struct flash_sec_info *fsec = NULL;
286 struct mbx_common_read_write_flashrom *req;
357{
358 char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "};
359 const char *p = (const char *)fw->data;
360 const struct flash_sec_info *fsec = NULL;
361 struct mbx_common_read_write_flashrom *req;
287 int rc = 0, i, img_type, bin_offset = 0;
288 boolean_t skip_image;
289 uint32_t optype = 0, size = 0, start = 0, num_bytes = 0;
290 uint32_t opcode = 0;
362 int rc = 0, i, bin_offset = 0, opcode, num_bytes;
291 OCE_DMA_MEM dma_mem;
363 OCE_DMA_MEM dma_mem;
364 struct flash_img_attri imgatt;
292
293 /* Validate Cookie */
294 bin_offset = (sizeof(struct flash_file_hdr) +
365
366 /* Validate Cookie */
367 bin_offset = (sizeof(struct flash_file_hdr) +
295 (num_imgs * sizeof(struct image_hdr)));
368 (num_imgs * sizeof(struct image_hdr)));
296 p += bin_offset;
297 while (p < ((const char *)fw->data + fw->datasize)) {
298 fsec = (const struct flash_sec_info *)p;
299 if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
300 break;
301 fsec = NULL;
302 p += 32;
303 }
304
305 if (!fsec) {
306 device_printf(sc->dev,
369 p += bin_offset;
370 while (p < ((const char *)fw->data + fw->datasize)) {
371 fsec = (const struct flash_sec_info *)p;
372 if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
373 break;
374 fsec = NULL;
375 p += 32;
376 }
377
378 if (!fsec) {
379 device_printf(sc->dev,
307 "Invalid Cookie. Firmware image corrupted ?\n");
380 "Invalid Cookie. Firmware image corrupted ?\n");
308 return EINVAL;
309 }
310
311 rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom)
312 + 32*1024, &dma_mem, 0);
313 if (rc) {
314 device_printf(sc->dev,
381 return EINVAL;
382 }
383
384 rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom)
385 + 32*1024, &dma_mem, 0);
386 if (rc) {
387 device_printf(sc->dev,
315 "Memory allocation failure while flashing\n");
388 "Memory allocation failure while flashing\n");
316 return ENOMEM;
317 }
318 req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
319
389 return ENOMEM;
390 }
391 req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
392
320 for (i = 0; i < MAX_FLASH_COMP; i++) {
393 if (IS_SH(sc))
394 num_imgs = HOST_32(fsec->fsec_hdr.num_images);
395 else if (IS_BE3(sc))
396 num_imgs = MAX_FLASH_COMP;
321
397
322 img_type = fsec->fsec_entry[i].type;
323 skip_image = FALSE;
324 switch (img_type) {
325 case IMG_ISCSI:
326 optype = 0;
327 size = 2097152;
328 start = 2097152;
329 break;
330 case IMG_REDBOOT:
331 optype = 1;
332 size = 1048576;
333 start = 262144;
334 if (!oce_img_flashing_required(sc, fw->data,
335 optype, start, size, bin_offset))
336 skip_image = TRUE;
337 break;
338 case IMG_BIOS:
339 optype = 2;
340 size = 524288;
341 start = 12582912;
342 break;
343 case IMG_PXEBIOS:
344 optype = 3;
345 size = 524288;
346 start = 13107200;
347 break;
348 case IMG_FCOEBIOS:
349 optype = 8;
350 size = 524288;
351 start = 13631488;
352 break;
353 case IMG_ISCSI_BAK:
354 optype = 9;
355 size = 2097152;
356 start = 4194304;
357 break;
358 case IMG_FCOE:
359 optype = 10;
360 size = 2097152;
361 start = 6291456;
362 break;
363 case IMG_FCOE_BAK:
364 optype = 11;
365 size = 2097152;
366 start = 8388608;
367 break;
368 case IMG_NCSI:
369 optype = 13;
370 size = 262144;
371 start = 15990784;
372 break;
373 case IMG_PHY:
374 optype = 99;
375 size = 262144;
376 start = 1310720;
377 if (!oce_phy_flashing_required(sc))
378 skip_image = TRUE;
379 break;
380 default:
381 skip_image = TRUE;
382 break;
383 }
384 if (skip_image)
398 for (i = 0; i < num_imgs; i++) {
399
400 bzero(&imgatt, sizeof(struct flash_img_attri));
401
402 oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset);
403
404 if (imgatt.skip_image)
385 continue;
386
387 p = fw->data;
405 continue;
406
407 p = fw->data;
388 p = p + bin_offset + start;
389 if ((p + size) > ((const char *)fw->data + fw->datasize)) {
408 p = p + bin_offset + imgatt.img_offset;
409
410 if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) {
390 rc = 1;
391 goto ret;
392 }
393
411 rc = 1;
412 goto ret;
413 }
414
394 while (size) {
415 while (imgatt.img_size) {
395
416
396 if (size > 32*1024)
417 if (imgatt.img_size > 32*1024)
397 num_bytes = 32*1024;
398 else
418 num_bytes = 32*1024;
419 else
399 num_bytes = size;
400 size -= num_bytes;
420 num_bytes = imgatt.img_size;
421 imgatt.img_size -= num_bytes;
401
422
402 if (!size)
423 if (!imgatt.img_size)
403 opcode = FLASHROM_OPER_FLASH;
404 else
405 opcode = FLASHROM_OPER_SAVE;
406
407 memcpy(req->data_buffer, p, num_bytes);
408 p += num_bytes;
409
424 opcode = FLASHROM_OPER_FLASH;
425 else
426 opcode = FLASHROM_OPER_SAVE;
427
428 memcpy(req->data_buffer, p, num_bytes);
429 p += num_bytes;
430
410 rc = oce_mbox_write_flashrom(sc, optype, opcode,
411 &dma_mem, num_bytes);
431 rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode,
432 &dma_mem, num_bytes);
412 if (rc) {
413 device_printf(sc->dev,
433 if (rc) {
434 device_printf(sc->dev,
414 "cmd to write to flash rom failed.\n");
435 "cmd to write to flash rom failed.\n");
415 rc = EIO;
416 goto ret;
417 }
418 /* Leave the CPU for others for some time */
419 pause("yield", 10);
420
421 }
436 rc = EIO;
437 goto ret;
438 }
439 /* Leave the CPU for others for some time */
440 pause("yield", 10);
441
442 }
443
422 }
444 }
445
423ret:
424 oce_dma_free(sc, &dma_mem);
425 return rc;
446ret:
447 oce_dma_free(sc, &dma_mem);
448 return rc;
449}
426
450
451#define UFI_TYPE2 2
452#define UFI_TYPE3 3
453#define UFI_TYPE3R 10
454#define UFI_TYPE4 4
455#define UFI_TYPE4R 11
456static int oce_get_ufi_type(POCE_SOFTC sc,
457 const struct flash_file_hdr *fhdr)
458{
459 if (fhdr == NULL)
460 goto be_get_ufi_exit;
461
462 if (IS_SH(sc) && fhdr->build[0] == '4') {
463 if (fhdr->asic_type_rev >= 0x10)
464 return UFI_TYPE4R;
465 else
466 return UFI_TYPE4;
467 } else if (IS_BE3(sc) && fhdr->build[0] == '3') {
468 if (fhdr->asic_type_rev == 0x10)
469 return UFI_TYPE3R;
470 else
471 return UFI_TYPE3;
472 } else if (IS_BE2(sc) && fhdr->build[0] == '2')
473 return UFI_TYPE2;
474
475be_get_ufi_exit:
476 device_printf(sc->dev,
477 "UFI and Interface are not compatible for flashing\n");
478 return -1;
427}
428
429
479}
480
481
482static int
483oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
484{
485 int rc = 0, num_imgs = 0, i = 0, ufi_type;
486 const struct flash_file_hdr *fhdr;
487 const struct image_hdr *img_ptr;
488
489 fhdr = (const struct flash_file_hdr *)fw->data;
490
491 ufi_type = oce_get_ufi_type(sc, fhdr);
492
493 /* Display flash version */
494 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
495
496 num_imgs = fhdr->num_imgs;
497 for (i = 0; i < num_imgs; i++) {
498 img_ptr = (const struct image_hdr *)((const char *)fw->data +
499 sizeof(struct flash_file_hdr) +
500 (i * sizeof(struct image_hdr)));
501
502 if (img_ptr->imageid != 1)
503 continue;
504
505 switch (ufi_type) {
506 case UFI_TYPE4R:
507 rc = oce_sh_be3_flashdata(sc, fw,
508 num_imgs);
509 break;
510 case UFI_TYPE4:
511 if (sc->asic_revision < 0x10)
512 rc = oce_sh_be3_flashdata(sc, fw,
513 num_imgs);
514 else {
515 rc = -1;
516 device_printf(sc->dev,
517 "Cant load SH A0 UFI on B0\n");
518 }
519 break;
520 default:
521 rc = -1;
522 break;
523
524 }
525 }
526
527 return rc;
528}
529
530static int
531oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
532{
533 int rc = 0, num_imgs = 0, i = 0;
534 const struct flash_file_hdr *fhdr;
535 const struct image_hdr *img_ptr;
536
537 fhdr = (const struct flash_file_hdr *)fw->data;
538 if (fhdr->build[0] != '3') {
539 device_printf(sc->dev, "Invalid BE3 firmware image\n");
540 return EINVAL;
541 }
542 /* Display flash version */
543 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
544
545 num_imgs = fhdr->num_imgs;
546 for (i = 0; i < num_imgs; i++) {
547 img_ptr = (const struct image_hdr *)((const char *)fw->data +
548 sizeof(struct flash_file_hdr) +
549 (i * sizeof(struct image_hdr)));
550 if (img_ptr->imageid == 1) {
551 rc = oce_sh_be3_flashdata(sc, fw, num_imgs);
552
553 break;
554 }
555 }
556
557 return rc;
558}
559
560
430static boolean_t
431oce_phy_flashing_required(POCE_SOFTC sc)
432{
433 int status = 0;
434 struct oce_phy_info phy_info;
435
436 status = oce_mbox_get_phy_info(sc, &phy_info);
437 if (status)

--- 910 unchanged lines hidden ---
561static boolean_t
562oce_phy_flashing_required(POCE_SOFTC sc)
563{
564 int status = 0;
565 struct oce_phy_info phy_info;
566
567 status = oce_mbox_get_phy_info(sc, &phy_info);
568 if (status)

--- 910 unchanged lines hidden ---