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

scsi: fnic: Enable fnic devcmd2 interface

This patch adds changes to check if fnic devcmd2 interface is exported by
the firmware. If devcmd2 interfaces is exported, driver starts using it
else falls back to fnic devcmd1 interface.

Signed-off-by: Satish Kharat <satishkh@cisco.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Satish Kharat and committed by
Martin K. Petersen
e119d14c 0a2fdd22

+29 -1
+10 -1
drivers/scsi/fnic/fnic_main.c
··· 658 658 goto err_out_iounmap; 659 659 } 660 660 661 + err = vnic_dev_cmd_init(fnic->vdev); 662 + if (err) { 663 + shost_printk(KERN_ERR, fnic->lport->host, 664 + "vnic_dev_cmd_init() returns %d, aborting\n", 665 + err); 666 + goto err_out_vnic_unregister; 667 + } 668 + 661 669 err = fnic_dev_wait(fnic->vdev, vnic_dev_open, 662 670 vnic_dev_open_done, CMD_OPENF_RQ_ENABLE_THEN_POST); 663 671 if (err) { 664 672 shost_printk(KERN_ERR, fnic->lport->host, 665 673 "vNIC dev open failed, aborting.\n"); 666 - goto err_out_vnic_unregister; 674 + goto err_out_dev_cmd_deinit; 667 675 } 668 676 669 677 err = vnic_dev_init(fnic->vdev, 0); ··· 929 921 fnic_clear_intr_mode(fnic); 930 922 err_out_dev_close: 931 923 vnic_dev_close(fnic->vdev); 924 + err_out_dev_cmd_deinit: 932 925 err_out_vnic_unregister: 933 926 vnic_dev_unregister(fnic->vdev); 934 927 err_out_iounmap:
+17
drivers/scsi/fnic/vnic_dev.c
··· 934 934 vnic_dev_unregister(vdev); 935 935 return NULL; 936 936 } 937 + 938 + int vnic_dev_cmd_init(struct vnic_dev *vdev) 939 + { 940 + int err; 941 + void *p; 942 + 943 + p = vnic_dev_get_res(vdev, RES_TYPE_DEVCMD2, 0); 944 + if (p) { 945 + pr_err("fnic: DEVCMD2 resource found!\n"); 946 + err = vnic_dev_init_devcmd2(vdev); 947 + } else { 948 + pr_err("fnic: DEVCMD2 not found, fall back to Devcmd\n"); 949 + err = vnic_dev_init_devcmd1(vdev); 950 + } 951 + 952 + return err; 953 + }
+2
drivers/scsi/fnic/vnic_dev.h
··· 36 36 #define vnic_dev_fw_info fnic_dev_fw_info 37 37 #define vnic_dev_spec fnic_dev_spec 38 38 #define vnic_dev_stats_clear fnic_dev_stats_clear 39 + #define vnic_dev_cmd_init fnic_dev_cmd_init 39 40 #define vnic_dev_stats_dump fnic_dev_stats_dump 40 41 #define vnic_dev_hang_notify fnic_dev_hang_notify 41 42 #define vnic_dev_packet_filter fnic_dev_packet_filter ··· 129 128 int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, 130 129 unsigned int size, void *value); 131 130 int vnic_dev_stats_clear(struct vnic_dev *vdev); 131 + int vnic_dev_cmd_init(struct vnic_dev *vdev); 132 132 int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats); 133 133 int vnic_dev_hang_notify(struct vnic_dev *vdev); 134 134 void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,