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

ntb: Split ntb_setup_msix() into separate BWD/SNB routines

This is an cleanup effort to make ntb_setup_msix() more
readable - use ntb_setup_bwd_msix() to init MSI-Xs on
BWD hardware and ntb_setup_snb_msix() - on SNB hardware.

Function ntb_setup_snb_msix() also initializes MSI-Xs the
way it should has been done - looping pci_enable_msix()
until success or failure.

Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Jon Mason <jon.mason@intel.com>

authored by

Alexander Gordeev and committed by
Jon Mason
53a788a7 77733513

+102 -65
+102 -65
drivers/ntb/ntb_hw.c
··· 1080 1080 return IRQ_HANDLED; 1081 1081 } 1082 1082 1083 - static int ntb_setup_msix(struct ntb_device *ndev) 1083 + static int ntb_setup_snb_msix(struct ntb_device *ndev, int msix_entries) 1084 1084 { 1085 1085 struct pci_dev *pdev = ndev->pdev; 1086 1086 struct msix_entry *msix; 1087 + int rc, i; 1088 + 1089 + if (msix_entries < ndev->limits.msix_cnt) 1090 + return -ENOSPC; 1091 + 1092 + rc = pci_enable_msix(pdev, ndev->msix_entries, msix_entries); 1093 + if (rc < 0) 1094 + return rc; 1095 + else if (rc > 0) 1096 + return -ENOSPC; 1097 + 1098 + for (i = 0; i < msix_entries; i++) { 1099 + msix = &ndev->msix_entries[i]; 1100 + WARN_ON(!msix->vector); 1101 + 1102 + if (i == msix_entries - 1) { 1103 + rc = request_irq(msix->vector, 1104 + xeon_event_msix_irq, 0, 1105 + "ntb-event-msix", ndev); 1106 + if (rc) 1107 + goto err; 1108 + } else { 1109 + rc = request_irq(msix->vector, 1110 + xeon_callback_msix_irq, 0, 1111 + "ntb-callback-msix", 1112 + &ndev->db_cb[i]); 1113 + if (rc) 1114 + goto err; 1115 + } 1116 + } 1117 + 1118 + ndev->num_msix = msix_entries; 1119 + ndev->max_cbs = msix_entries - 1; 1120 + 1121 + return 0; 1122 + 1123 + err: 1124 + while (--i >= 0) { 1125 + /* Code never reaches here for entry nr 'ndev->num_msix - 1' */ 1126 + msix = &ndev->msix_entries[i]; 1127 + free_irq(msix->vector, &ndev->db_cb[i]); 1128 + } 1129 + 1130 + pci_disable_msix(pdev); 1131 + ndev->num_msix = 0; 1132 + 1133 + return rc; 1134 + } 1135 + 1136 + static int ntb_setup_bwd_msix(struct ntb_device *ndev, int msix_entries) 1137 + { 1138 + struct pci_dev *pdev = ndev->pdev; 1139 + struct msix_entry *msix; 1140 + int rc, i; 1141 + 1142 + retry: 1143 + rc = pci_enable_msix(pdev, ndev->msix_entries, msix_entries); 1144 + if (rc < 0) 1145 + return rc; 1146 + else if (rc > 0) { 1147 + dev_warn(&pdev->dev, 1148 + "Only %d MSI-X vectors. " 1149 + "Limiting the number of queues to that number.\n", 1150 + rc); 1151 + msix_entries = rc; 1152 + goto retry; 1153 + } 1154 + 1155 + for (i = 0; i < msix_entries; i++) { 1156 + msix = &ndev->msix_entries[i]; 1157 + WARN_ON(!msix->vector); 1158 + 1159 + rc = request_irq(msix->vector, bwd_callback_msix_irq, 0, 1160 + "ntb-callback-msix", &ndev->db_cb[i]); 1161 + if (rc) 1162 + goto err; 1163 + } 1164 + 1165 + ndev->num_msix = msix_entries; 1166 + ndev->max_cbs = msix_entries; 1167 + 1168 + return 0; 1169 + 1170 + err: 1171 + while (--i >= 0) 1172 + free_irq(msix->vector, &ndev->db_cb[i]); 1173 + 1174 + pci_disable_msix(pdev); 1175 + ndev->num_msix = 0; 1176 + 1177 + return rc; 1178 + } 1179 + 1180 + static int ntb_setup_msix(struct ntb_device *ndev) 1181 + { 1182 + struct pci_dev *pdev = ndev->pdev; 1087 1183 int msix_entries; 1088 1184 int rc, i; 1089 1185 ··· 1202 1106 for (i = 0; i < msix_entries; i++) 1203 1107 ndev->msix_entries[i].entry = i; 1204 1108 1205 - rc = pci_enable_msix(pdev, ndev->msix_entries, msix_entries); 1206 - if (rc < 0) 1207 - goto err1; 1208 - if (rc > 0) { 1209 - /* On SNB, the link interrupt is always tied to 4th vector. If 1210 - * we can't get all 4, then we can't use MSI-X. 1211 - */ 1212 - if (ndev->hw_type != BWD_HW) { 1213 - rc = -EIO; 1214 - goto err1; 1215 - } 1216 - 1217 - dev_warn(&pdev->dev, 1218 - "Only %d MSI-X vectors. Limiting the number of queues to that number.\n", 1219 - rc); 1220 - msix_entries = rc; 1221 - 1222 - rc = pci_enable_msix(pdev, ndev->msix_entries, msix_entries); 1223 - if (rc) 1224 - goto err1; 1225 - } 1226 - 1227 - for (i = 0; i < msix_entries; i++) { 1228 - msix = &ndev->msix_entries[i]; 1229 - WARN_ON(!msix->vector); 1230 - 1231 - /* Use the last MSI-X vector for Link status */ 1232 - if (ndev->hw_type == BWD_HW) { 1233 - rc = request_irq(msix->vector, bwd_callback_msix_irq, 0, 1234 - "ntb-callback-msix", &ndev->db_cb[i]); 1235 - if (rc) 1236 - goto err2; 1237 - } else { 1238 - if (i == msix_entries - 1) { 1239 - rc = request_irq(msix->vector, 1240 - xeon_event_msix_irq, 0, 1241 - "ntb-event-msix", ndev); 1242 - if (rc) 1243 - goto err2; 1244 - } else { 1245 - rc = request_irq(msix->vector, 1246 - xeon_callback_msix_irq, 0, 1247 - "ntb-callback-msix", 1248 - &ndev->db_cb[i]); 1249 - if (rc) 1250 - goto err2; 1251 - } 1252 - } 1253 - } 1254 - 1255 - ndev->num_msix = msix_entries; 1256 1109 if (ndev->hw_type == BWD_HW) 1257 - ndev->max_cbs = msix_entries; 1110 + rc = ntb_setup_bwd_msix(ndev, msix_entries); 1258 1111 else 1259 - ndev->max_cbs = msix_entries - 1; 1112 + rc = ntb_setup_snb_msix(ndev, msix_entries); 1113 + if (rc) 1114 + goto err1; 1260 1115 1261 1116 return 0; 1262 1117 1263 - err2: 1264 - while (--i >= 0) { 1265 - msix = &ndev->msix_entries[i]; 1266 - if (ndev->hw_type != BWD_HW && i == ndev->num_msix - 1) 1267 - free_irq(msix->vector, ndev); 1268 - else 1269 - free_irq(msix->vector, &ndev->db_cb[i]); 1270 - } 1271 - pci_disable_msix(pdev); 1272 1118 err1: 1273 1119 kfree(ndev->msix_entries); 1274 - dev_err(&pdev->dev, "Error allocating MSI-X interrupt\n"); 1275 1120 err: 1276 - ndev->num_msix = 0; 1121 + dev_err(&pdev->dev, "Error allocating MSI-X interrupt\n"); 1277 1122 return rc; 1278 1123 } 1279 1124