Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] qla2xxx: Add firmware-dump kobject uevent notification.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

authored by

Andrew Vasquez and committed by
James Bottomley
3420d36c f8ceafde

+72 -55
+8
Documentation/ABI/stable/sysfs-driver-qla2xxx
··· 1 + What: /sys/bus/pci/drivers/qla2xxx/.../devices/* 2 + Date: September 2009 3 + Contact: QLogic Linux Driver <linux-driver@qlogic.com> 4 + Description: qla2xxx-udev.sh currently looks for uevent CHANGE events to 5 + signal a firmware-dump has been generated by the driver and is 6 + ready for retrieval. 7 + Users: qla2xxx-udev.sh. Proposed changes should be mailed to 8 + linux-driver@qlogic.com
+23 -55
drivers/scsi/qla2xxx/qla_dbg.c
··· 377 377 return ptr + sizeof(struct qla2xxx_mq_chain); 378 378 } 379 379 380 + static void 381 + qla2xxx_dump_post_process(scsi_qla_host_t *vha, int rval) 382 + { 383 + struct qla_hw_data *ha = vha->hw; 384 + 385 + if (rval != QLA_SUCCESS) { 386 + qla_printk(KERN_WARNING, ha, 387 + "Failed to dump firmware (%x)!!!\n", rval); 388 + ha->fw_dumped = 0; 389 + } else { 390 + qla_printk(KERN_INFO, ha, 391 + "Firmware dump saved to temp buffer (%ld/%p).\n", 392 + vha->host_no, ha->fw_dump); 393 + ha->fw_dumped = 1; 394 + qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP); 395 + } 396 + } 397 + 380 398 /** 381 399 * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. 382 400 * @ha: HA context ··· 548 530 if (rval == QLA_SUCCESS) 549 531 qla2xxx_copy_queues(ha, nxt); 550 532 551 - if (rval != QLA_SUCCESS) { 552 - qla_printk(KERN_WARNING, ha, 553 - "Failed to dump firmware (%x)!!!\n", rval); 554 - ha->fw_dumped = 0; 555 - 556 - } else { 557 - qla_printk(KERN_INFO, ha, 558 - "Firmware dump saved to temp buffer (%ld/%p).\n", 559 - base_vha->host_no, ha->fw_dump); 560 - ha->fw_dumped = 1; 561 - } 533 + qla2xxx_dump_post_process(base_vha, rval); 562 534 563 535 qla2300_fw_dump_failed: 564 536 if (!hardware_locked) ··· 745 737 if (rval == QLA_SUCCESS) 746 738 qla2xxx_copy_queues(ha, &fw->risc_ram[cnt]); 747 739 748 - if (rval != QLA_SUCCESS) { 749 - qla_printk(KERN_WARNING, ha, 750 - "Failed to dump firmware (%x)!!!\n", rval); 751 - ha->fw_dumped = 0; 752 - 753 - } else { 754 - qla_printk(KERN_INFO, ha, 755 - "Firmware dump saved to temp buffer (%ld/%p).\n", 756 - base_vha->host_no, ha->fw_dump); 757 - ha->fw_dumped = 1; 758 - } 740 + qla2xxx_dump_post_process(base_vha, rval); 759 741 760 742 qla2100_fw_dump_failed: 761 743 if (!hardware_locked) ··· 982 984 qla24xx_copy_eft(ha, nxt); 983 985 984 986 qla24xx_fw_dump_failed_0: 985 - if (rval != QLA_SUCCESS) { 986 - qla_printk(KERN_WARNING, ha, 987 - "Failed to dump firmware (%x)!!!\n", rval); 988 - ha->fw_dumped = 0; 989 - 990 - } else { 991 - qla_printk(KERN_INFO, ha, 992 - "Firmware dump saved to temp buffer (%ld/%p).\n", 993 - base_vha->host_no, ha->fw_dump); 994 - ha->fw_dumped = 1; 995 - } 987 + qla2xxx_dump_post_process(base_vha, rval); 996 988 997 989 qla24xx_fw_dump_failed: 998 990 if (!hardware_locked) ··· 1293 1305 } 1294 1306 1295 1307 qla25xx_fw_dump_failed_0: 1296 - if (rval != QLA_SUCCESS) { 1297 - qla_printk(KERN_WARNING, ha, 1298 - "Failed to dump firmware (%x)!!!\n", rval); 1299 - ha->fw_dumped = 0; 1300 - 1301 - } else { 1302 - qla_printk(KERN_INFO, ha, 1303 - "Firmware dump saved to temp buffer (%ld/%p).\n", 1304 - base_vha->host_no, ha->fw_dump); 1305 - ha->fw_dumped = 1; 1306 - } 1308 + qla2xxx_dump_post_process(base_vha, rval); 1307 1309 1308 1310 qla25xx_fw_dump_failed: 1309 1311 if (!hardware_locked) ··· 1606 1628 } 1607 1629 1608 1630 qla81xx_fw_dump_failed_0: 1609 - if (rval != QLA_SUCCESS) { 1610 - qla_printk(KERN_WARNING, ha, 1611 - "Failed to dump firmware (%x)!!!\n", rval); 1612 - ha->fw_dumped = 0; 1613 - 1614 - } else { 1615 - qla_printk(KERN_INFO, ha, 1616 - "Firmware dump saved to temp buffer (%ld/%p).\n", 1617 - base_vha->host_no, ha->fw_dump); 1618 - ha->fw_dumped = 1; 1619 - } 1631 + qla2xxx_dump_post_process(base_vha, rval); 1620 1632 1621 1633 qla81xx_fw_dump_failed: 1622 1634 if (!hardware_locked)
+5
drivers/scsi/qla2xxx/qla_def.h
··· 2123 2123 QLA_EVT_ASYNC_LOGIN_DONE, 2124 2124 QLA_EVT_ASYNC_LOGOUT, 2125 2125 QLA_EVT_ASYNC_LOGOUT_DONE, 2126 + QLA_EVT_UEVENT, 2126 2127 }; 2127 2128 2128 2129 ··· 2147 2146 #define QLA_LOGIO_LOGIN_RETRIED BIT_0 2148 2147 u16 data[2]; 2149 2148 } logio; 2149 + struct { 2150 + u32 code; 2151 + #define QLA_UEVENT_CODE_FW_DUMP 0 2152 + } uevent; 2150 2153 } u; 2151 2154 }; 2152 2155
+1
drivers/scsi/qla2xxx/qla_gbl.h
··· 92 92 uint16_t *); 93 93 extern int qla2x00_post_async_logout_done_work(struct scsi_qla_host *, 94 94 fc_port_t *, uint16_t *); 95 + extern int qla2x00_post_uevent_work(struct scsi_qla_host *, u32); 95 96 96 97 extern int qla81xx_restart_mpi_firmware(scsi_qla_host_t *); 97 98
+35
drivers/scsi/qla2xxx/qla_os.c
··· 11 11 #include <linux/delay.h> 12 12 #include <linux/kthread.h> 13 13 #include <linux/mutex.h> 14 + #include <linux/kobject.h> 14 15 15 16 #include <scsi/scsi_tcq.h> 16 17 #include <scsi/scsicam.h> ··· 2654 2653 qla2x00_post_async_work(logout, QLA_EVT_ASYNC_LOGOUT); 2655 2654 qla2x00_post_async_work(logout_done, QLA_EVT_ASYNC_LOGOUT_DONE); 2656 2655 2656 + int 2657 + qla2x00_post_uevent_work(struct scsi_qla_host *vha, u32 code) 2658 + { 2659 + struct qla_work_evt *e; 2660 + 2661 + e = qla2x00_alloc_work(vha, QLA_EVT_UEVENT); 2662 + if (!e) 2663 + return QLA_FUNCTION_FAILED; 2664 + 2665 + e->u.uevent.code = code; 2666 + return qla2x00_post_work(vha, e); 2667 + } 2668 + 2669 + static void 2670 + qla2x00_uevent_emit(struct scsi_qla_host *vha, u32 code) 2671 + { 2672 + char event_string[40]; 2673 + char *envp[] = { event_string, NULL }; 2674 + 2675 + switch (code) { 2676 + case QLA_UEVENT_CODE_FW_DUMP: 2677 + snprintf(event_string, sizeof(event_string), "FW_DUMP=%ld", 2678 + vha->host_no); 2679 + break; 2680 + default: 2681 + /* do nothing */ 2682 + break; 2683 + } 2684 + kobject_uevent_env(&vha->hw->pdev->dev.kobj, KOBJ_CHANGE, envp); 2685 + } 2686 + 2657 2687 void 2658 2688 qla2x00_do_work(struct scsi_qla_host *vha) 2659 2689 { ··· 2721 2689 case QLA_EVT_ASYNC_LOGOUT_DONE: 2722 2690 qla2x00_async_logout_done(vha, e->u.logio.fcport, 2723 2691 e->u.logio.data); 2692 + break; 2693 + case QLA_EVT_UEVENT: 2694 + qla2x00_uevent_emit(vha, e->u.uevent.code); 2724 2695 break; 2725 2696 } 2726 2697 if (e->flags & QLA_EVT_FLAG_FREE)