diff options
Diffstat (limited to 'drivers/infiniband/hw/nes/nes.c')
-rw-r--r-- | drivers/infiniband/hw/nes/nes.c | 95 |
1 files changed, 86 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index b0cab64e5e3d..a2b04d62b1a4 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -70,27 +70,31 @@ int interrupt_mod_interval = 0; | |||
70 | 70 | ||
71 | /* Interoperability */ | 71 | /* Interoperability */ |
72 | int mpa_version = 1; | 72 | int mpa_version = 1; |
73 | module_param(mpa_version, int, 0); | 73 | module_param(mpa_version, int, 0644); |
74 | MODULE_PARM_DESC(mpa_version, "MPA version to be used int MPA Req/Resp (0 or 1)"); | 74 | MODULE_PARM_DESC(mpa_version, "MPA version to be used int MPA Req/Resp (0 or 1)"); |
75 | 75 | ||
76 | /* Interoperability */ | 76 | /* Interoperability */ |
77 | int disable_mpa_crc = 0; | 77 | int disable_mpa_crc = 0; |
78 | module_param(disable_mpa_crc, int, 0); | 78 | module_param(disable_mpa_crc, int, 0644); |
79 | MODULE_PARM_DESC(disable_mpa_crc, "Disable checking of MPA CRC"); | 79 | MODULE_PARM_DESC(disable_mpa_crc, "Disable checking of MPA CRC"); |
80 | 80 | ||
81 | unsigned int send_first = 0; | 81 | unsigned int send_first = 0; |
82 | module_param(send_first, int, 0); | 82 | module_param(send_first, int, 0644); |
83 | MODULE_PARM_DESC(send_first, "Send RDMA Message First on Active Connection"); | 83 | MODULE_PARM_DESC(send_first, "Send RDMA Message First on Active Connection"); |
84 | 84 | ||
85 | 85 | ||
86 | unsigned int nes_drv_opt = 0; | 86 | unsigned int nes_drv_opt = 0; |
87 | module_param(nes_drv_opt, int, 0); | 87 | module_param(nes_drv_opt, int, 0644); |
88 | MODULE_PARM_DESC(nes_drv_opt, "Driver option parameters"); | 88 | MODULE_PARM_DESC(nes_drv_opt, "Driver option parameters"); |
89 | 89 | ||
90 | unsigned int nes_debug_level = 0; | 90 | unsigned int nes_debug_level = 0; |
91 | module_param_named(debug_level, nes_debug_level, uint, 0644); | 91 | module_param_named(debug_level, nes_debug_level, uint, 0644); |
92 | MODULE_PARM_DESC(debug_level, "Enable debug output level"); | 92 | MODULE_PARM_DESC(debug_level, "Enable debug output level"); |
93 | 93 | ||
94 | unsigned int wqm_quanta = 0x10000; | ||
95 | module_param(wqm_quanta, int, 0644); | ||
96 | MODULE_PARM_DESC(wqm_quanta, "WQM quanta"); | ||
97 | |||
94 | LIST_HEAD(nes_adapter_list); | 98 | LIST_HEAD(nes_adapter_list); |
95 | static LIST_HEAD(nes_dev_list); | 99 | static LIST_HEAD(nes_dev_list); |
96 | 100 | ||
@@ -557,12 +561,32 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i | |||
557 | goto bail5; | 561 | goto bail5; |
558 | } | 562 | } |
559 | nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval; | 563 | nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval; |
564 | nesdev->nesadapter->wqm_quanta = wqm_quanta; | ||
560 | 565 | ||
561 | /* nesdev->base_doorbell_index = | 566 | /* nesdev->base_doorbell_index = |
562 | nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */ | 567 | nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */ |
563 | nesdev->base_doorbell_index = 1; | 568 | nesdev->base_doorbell_index = 1; |
564 | nesdev->doorbell_start = nesdev->nesadapter->doorbell_start; | 569 | nesdev->doorbell_start = nesdev->nesadapter->doorbell_start; |
565 | nesdev->mac_index = PCI_FUNC(nesdev->pcidev->devfn) % nesdev->nesadapter->port_count; | 570 | if (nesdev->nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G) { |
571 | switch (PCI_FUNC(nesdev->pcidev->devfn) % | ||
572 | nesdev->nesadapter->port_count) { | ||
573 | case 1: | ||
574 | nesdev->mac_index = 2; | ||
575 | break; | ||
576 | case 2: | ||
577 | nesdev->mac_index = 1; | ||
578 | break; | ||
579 | case 3: | ||
580 | nesdev->mac_index = 3; | ||
581 | break; | ||
582 | case 0: | ||
583 | default: | ||
584 | nesdev->mac_index = 0; | ||
585 | } | ||
586 | } else { | ||
587 | nesdev->mac_index = PCI_FUNC(nesdev->pcidev->devfn) % | ||
588 | nesdev->nesadapter->port_count; | ||
589 | } | ||
566 | 590 | ||
567 | tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev); | 591 | tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev); |
568 | 592 | ||
@@ -581,7 +605,7 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i | |||
581 | nesdev->int_req = (0x101 << PCI_FUNC(nesdev->pcidev->devfn)) | | 605 | nesdev->int_req = (0x101 << PCI_FUNC(nesdev->pcidev->devfn)) | |
582 | (1 << (PCI_FUNC(nesdev->pcidev->devfn)+16)); | 606 | (1 << (PCI_FUNC(nesdev->pcidev->devfn)+16)); |
583 | if (PCI_FUNC(nesdev->pcidev->devfn) < 4) { | 607 | if (PCI_FUNC(nesdev->pcidev->devfn) < 4) { |
584 | nesdev->int_req |= (1 << (PCI_FUNC(nesdev->pcidev->devfn)+24)); | 608 | nesdev->int_req |= (1 << (PCI_FUNC(nesdev->mac_index)+24)); |
585 | } | 609 | } |
586 | 610 | ||
587 | /* TODO: This really should be the first driver to load, not function 0 */ | 611 | /* TODO: This really should be the first driver to load, not function 0 */ |
@@ -772,14 +796,14 @@ static ssize_t nes_show_adapter(struct device_driver *ddp, char *buf) | |||
772 | 796 | ||
773 | list_for_each_entry(nesdev, &nes_dev_list, list) { | 797 | list_for_each_entry(nesdev, &nes_dev_list, list) { |
774 | if (i == ee_flsh_adapter) { | 798 | if (i == ee_flsh_adapter) { |
775 | devfn = nesdev->nesadapter->devfn; | 799 | devfn = nesdev->pcidev->devfn; |
776 | bus_number = nesdev->nesadapter->bus_number; | 800 | bus_number = nesdev->pcidev->bus->number; |
777 | break; | 801 | break; |
778 | } | 802 | } |
779 | i++; | 803 | i++; |
780 | } | 804 | } |
781 | 805 | ||
782 | return snprintf(buf, PAGE_SIZE, "%x:%x", bus_number, devfn); | 806 | return snprintf(buf, PAGE_SIZE, "%x:%x\n", bus_number, devfn); |
783 | } | 807 | } |
784 | 808 | ||
785 | static ssize_t nes_store_adapter(struct device_driver *ddp, | 809 | static ssize_t nes_store_adapter(struct device_driver *ddp, |
@@ -1050,6 +1074,55 @@ static ssize_t nes_store_idx_data(struct device_driver *ddp, | |||
1050 | return strnlen(buf, count); | 1074 | return strnlen(buf, count); |
1051 | } | 1075 | } |
1052 | 1076 | ||
1077 | |||
1078 | /** | ||
1079 | * nes_show_wqm_quanta | ||
1080 | */ | ||
1081 | static ssize_t nes_show_wqm_quanta(struct device_driver *ddp, char *buf) | ||
1082 | { | ||
1083 | u32 wqm_quanta_value = 0xdead; | ||
1084 | u32 i = 0; | ||
1085 | struct nes_device *nesdev; | ||
1086 | |||
1087 | list_for_each_entry(nesdev, &nes_dev_list, list) { | ||
1088 | if (i == ee_flsh_adapter) { | ||
1089 | wqm_quanta_value = nesdev->nesadapter->wqm_quanta; | ||
1090 | break; | ||
1091 | } | ||
1092 | i++; | ||
1093 | } | ||
1094 | |||
1095 | return snprintf(buf, PAGE_SIZE, "0x%X\n", wqm_quanta); | ||
1096 | } | ||
1097 | |||
1098 | |||
1099 | /** | ||
1100 | * nes_store_wqm_quanta | ||
1101 | */ | ||
1102 | static ssize_t nes_store_wqm_quanta(struct device_driver *ddp, | ||
1103 | const char *buf, size_t count) | ||
1104 | { | ||
1105 | unsigned long wqm_quanta_value; | ||
1106 | u32 wqm_config1; | ||
1107 | u32 i = 0; | ||
1108 | struct nes_device *nesdev; | ||
1109 | |||
1110 | strict_strtoul(buf, 0, &wqm_quanta_value); | ||
1111 | list_for_each_entry(nesdev, &nes_dev_list, list) { | ||
1112 | if (i == ee_flsh_adapter) { | ||
1113 | nesdev->nesadapter->wqm_quanta = wqm_quanta_value; | ||
1114 | wqm_config1 = nes_read_indexed(nesdev, | ||
1115 | NES_IDX_WQM_CONFIG1); | ||
1116 | nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG1, | ||
1117 | ((wqm_quanta_value << 1) | | ||
1118 | (wqm_config1 & 0x00000001))); | ||
1119 | break; | ||
1120 | } | ||
1121 | i++; | ||
1122 | } | ||
1123 | return strnlen(buf, count); | ||
1124 | } | ||
1125 | |||
1053 | static DRIVER_ATTR(adapter, S_IRUSR | S_IWUSR, | 1126 | static DRIVER_ATTR(adapter, S_IRUSR | S_IWUSR, |
1054 | nes_show_adapter, nes_store_adapter); | 1127 | nes_show_adapter, nes_store_adapter); |
1055 | static DRIVER_ATTR(eeprom_cmd, S_IRUSR | S_IWUSR, | 1128 | static DRIVER_ATTR(eeprom_cmd, S_IRUSR | S_IWUSR, |
@@ -1068,6 +1141,8 @@ static DRIVER_ATTR(idx_addr, S_IRUSR | S_IWUSR, | |||
1068 | nes_show_idx_addr, nes_store_idx_addr); | 1141 | nes_show_idx_addr, nes_store_idx_addr); |
1069 | static DRIVER_ATTR(idx_data, S_IRUSR | S_IWUSR, | 1142 | static DRIVER_ATTR(idx_data, S_IRUSR | S_IWUSR, |
1070 | nes_show_idx_data, nes_store_idx_data); | 1143 | nes_show_idx_data, nes_store_idx_data); |
1144 | static DRIVER_ATTR(wqm_quanta, S_IRUSR | S_IWUSR, | ||
1145 | nes_show_wqm_quanta, nes_store_wqm_quanta); | ||
1071 | 1146 | ||
1072 | static int nes_create_driver_sysfs(struct pci_driver *drv) | 1147 | static int nes_create_driver_sysfs(struct pci_driver *drv) |
1073 | { | 1148 | { |
@@ -1081,6 +1156,7 @@ static int nes_create_driver_sysfs(struct pci_driver *drv) | |||
1081 | error |= driver_create_file(&drv->driver, &driver_attr_nonidx_data); | 1156 | error |= driver_create_file(&drv->driver, &driver_attr_nonidx_data); |
1082 | error |= driver_create_file(&drv->driver, &driver_attr_idx_addr); | 1157 | error |= driver_create_file(&drv->driver, &driver_attr_idx_addr); |
1083 | error |= driver_create_file(&drv->driver, &driver_attr_idx_data); | 1158 | error |= driver_create_file(&drv->driver, &driver_attr_idx_data); |
1159 | error |= driver_create_file(&drv->driver, &driver_attr_wqm_quanta); | ||
1084 | return error; | 1160 | return error; |
1085 | } | 1161 | } |
1086 | 1162 | ||
@@ -1095,6 +1171,7 @@ static void nes_remove_driver_sysfs(struct pci_driver *drv) | |||
1095 | driver_remove_file(&drv->driver, &driver_attr_nonidx_data); | 1171 | driver_remove_file(&drv->driver, &driver_attr_nonidx_data); |
1096 | driver_remove_file(&drv->driver, &driver_attr_idx_addr); | 1172 | driver_remove_file(&drv->driver, &driver_attr_idx_addr); |
1097 | driver_remove_file(&drv->driver, &driver_attr_idx_data); | 1173 | driver_remove_file(&drv->driver, &driver_attr_idx_data); |
1174 | driver_remove_file(&drv->driver, &driver_attr_wqm_quanta); | ||
1098 | } | 1175 | } |
1099 | 1176 | ||
1100 | /** | 1177 | /** |