|
25 | 25 | */
|
26 | 26 |
|
27 | 27 | #ifndef TEST_MODE
|
28 |
| -#define MOD_VERSION "0.5.4" |
| 28 | +#define MOD_VERSION "0.5.5" |
29 | 29 | #else
|
30 | 30 | #define MOD_VERSION "TEST"
|
31 | 31 | #endif
|
@@ -867,6 +867,20 @@ static ssize_t qsfp_modprs_show(struct device *dev, struct device_attribute *att
|
867 | 867 | }
|
868 | 868 | DEVICE_ATTR_RO(qsfp_modprs);
|
869 | 869 |
|
| 870 | +static ssize_t qsfp_isr_flags_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 871 | +{ |
| 872 | + u8 data; |
| 873 | + int err; |
| 874 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 875 | + unsigned int portid = dev_data->portid; |
| 876 | + err = i2c_xcvr_access(I2C_XCVR_INRT,portid,&data,I2C_SMBUS_READ); |
| 877 | + if(err < 0){ |
| 878 | + return err; |
| 879 | + } |
| 880 | + return sprintf(buf, "0x%2.2x\n", data); |
| 881 | +} |
| 882 | +DEVICE_ATTR_RO(qsfp_isr_flags); |
| 883 | + |
870 | 884 | static ssize_t sfp_txfault_show(struct device *dev, struct device_attribute *attr, char *buf)
|
871 | 885 | {
|
872 | 886 | u8 data;
|
@@ -909,6 +923,20 @@ static ssize_t sfp_modabs_show(struct device *dev, struct device_attribute *attr
|
909 | 923 | }
|
910 | 924 | DEVICE_ATTR_RO(sfp_modabs);
|
911 | 925 |
|
| 926 | +static ssize_t sfp_isr_flags_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 927 | +{ |
| 928 | + u8 data; |
| 929 | + int err; |
| 930 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 931 | + unsigned int portid = dev_data->portid; |
| 932 | + err = i2c_xcvr_access(I2C_XCVR_INRT,portid,&data,I2C_SMBUS_READ); |
| 933 | + if(err < 0){ |
| 934 | + return err; |
| 935 | + } |
| 936 | + return sprintf(buf, "0x%2.2x\n", data); |
| 937 | +} |
| 938 | +DEVICE_ATTR_RO(sfp_isr_flags); |
| 939 | + |
912 | 940 | static ssize_t qsfp_modsel_show(struct device *dev, struct device_attribute *attr, char *buf)
|
913 | 941 | {
|
914 | 942 | u8 data;
|
@@ -980,6 +1008,35 @@ static ssize_t qsfp_reset_store(struct device *dev, struct device_attribute *att
|
980 | 1008 | }
|
981 | 1009 | DEVICE_ATTR_RW(qsfp_reset);
|
982 | 1010 |
|
| 1011 | +static ssize_t qsfp_isr_mask_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 1012 | +{ |
| 1013 | + u8 data; |
| 1014 | + int err; |
| 1015 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 1016 | + unsigned int portid = dev_data->portid; |
| 1017 | + err = i2c_xcvr_access(I2C_XCVR_MASK,portid,&data,I2C_SMBUS_READ); |
| 1018 | + if(err < 0){ |
| 1019 | + return err; |
| 1020 | + } |
| 1021 | + return sprintf(buf, "0x%2.2x\n", data); |
| 1022 | +} |
| 1023 | + |
| 1024 | +static ssize_t qsfp_isr_mask_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) |
| 1025 | +{ |
| 1026 | + ssize_t status; |
| 1027 | + u8 data; |
| 1028 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 1029 | + unsigned int portid = dev_data->portid; |
| 1030 | + |
| 1031 | + status = kstrtou8(buf, 0, &data); |
| 1032 | + if (status == 0) { |
| 1033 | + i2c_xcvr_access(I2C_XCVR_MASK,portid,&data,I2C_SMBUS_WRITE); |
| 1034 | + status = size; |
| 1035 | + } |
| 1036 | + return status; |
| 1037 | +} |
| 1038 | +DEVICE_ATTR_RW(qsfp_isr_mask); |
| 1039 | + |
983 | 1040 | static ssize_t sfp_txdisable_show(struct device *dev, struct device_attribute *attr, char *buf)
|
984 | 1041 | {
|
985 | 1042 | u8 data;
|
@@ -1017,15 +1074,48 @@ static ssize_t sfp_txdisable_store(struct device *dev, struct device_attribute *
|
1017 | 1074 | }
|
1018 | 1075 | DEVICE_ATTR_RW(sfp_txdisable);
|
1019 | 1076 |
|
| 1077 | +static ssize_t sfp_isr_mask_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 1078 | +{ |
| 1079 | + u8 data; |
| 1080 | + int err; |
| 1081 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 1082 | + unsigned int portid = dev_data->portid; |
| 1083 | + err = i2c_xcvr_access(I2C_XCVR_MASK,portid,&data,I2C_SMBUS_READ); |
| 1084 | + if(err < 0){ |
| 1085 | + return err; |
| 1086 | + } |
| 1087 | + return sprintf(buf, "0x%2.2x\n", data); |
| 1088 | +} |
| 1089 | + |
| 1090 | +static ssize_t sfp_isr_mask_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) |
| 1091 | +{ |
| 1092 | + ssize_t status; |
| 1093 | + u8 data; |
| 1094 | + struct sff_device_data *dev_data = dev_get_drvdata(dev); |
| 1095 | + unsigned int portid = dev_data->portid; |
| 1096 | + |
| 1097 | + status = kstrtou8(buf, 0, &data); |
| 1098 | + if (status == 0) { |
| 1099 | + i2c_xcvr_access(I2C_XCVR_MASK,portid,&data,I2C_SMBUS_WRITE); |
| 1100 | + status = size; |
| 1101 | + } |
| 1102 | + return status; |
| 1103 | +} |
| 1104 | +DEVICE_ATTR_RW(sfp_isr_mask); |
| 1105 | + |
1020 | 1106 | static struct attribute *sff_attrs[] = {
|
1021 | 1107 | &dev_attr_qsfp_modirq.attr,
|
1022 | 1108 | &dev_attr_qsfp_modprs.attr,
|
1023 | 1109 | &dev_attr_qsfp_modsel.attr,
|
1024 | 1110 | &dev_attr_qsfp_reset.attr,
|
| 1111 | + &dev_attr_qsfp_isr_flags.attr, |
| 1112 | + &dev_attr_qsfp_isr_mask.attr, |
1025 | 1113 | &dev_attr_sfp_txfault.attr,
|
1026 | 1114 | &dev_attr_sfp_rxlos.attr,
|
1027 | 1115 | &dev_attr_sfp_modabs.attr,
|
1028 | 1116 | &dev_attr_sfp_txdisable.attr,
|
| 1117 | + &dev_attr_sfp_isr_flags.attr, |
| 1118 | + &dev_attr_sfp_isr_mask.attr, |
1029 | 1119 | NULL,
|
1030 | 1120 | };
|
1031 | 1121 |
|
@@ -2413,7 +2503,6 @@ static long fpgafw_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned
|
2413 | 2503 | switch (status_reg) {
|
2414 | 2504 | case 0x0000 : status_reg = 0x8000;
|
2415 | 2505 | break;
|
2416 |
| - |
2417 | 2506 | case 0x8080 : status_reg = 0x80C0;
|
2418 | 2507 | break;
|
2419 | 2508 | case 0x80C0 : status_reg = 0x80F0;
|
|
0 commit comments