qlcnic_83xx_init.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513
  1. #include "qlcnic.h"
  2. #include "qlcnic_hw.h"
  3. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
  4. static int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter);
  5. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
  6. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
  7. static const char *const qlc_83xx_idc_states[] = {
  8. "Unknown",
  9. "Cold",
  10. "Init",
  11. "Ready",
  12. "Need Reset",
  13. "Need Quiesce",
  14. "Failed",
  15. "Quiesce"
  16. };
  17. /* Device States */
  18. enum qlcnic_83xx_states {
  19. QLC_83XX_IDC_DEV_UNKNOWN,
  20. QLC_83XX_IDC_DEV_COLD,
  21. QLC_83XX_IDC_DEV_INIT,
  22. QLC_83XX_IDC_DEV_READY,
  23. QLC_83XX_IDC_DEV_NEED_RESET,
  24. QLC_83XX_IDC_DEV_NEED_QUISCENT,
  25. QLC_83XX_IDC_DEV_FAILED,
  26. QLC_83XX_IDC_DEV_QUISCENT
  27. };
  28. static int
  29. qlcnic_83xx_idc_check_driver_presence_reg(struct qlcnic_adapter *adapter)
  30. {
  31. u32 val;
  32. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  33. if ((val & 0xFFFF))
  34. return 1;
  35. else
  36. return 0;
  37. }
  38. static void qlcnic_83xx_idc_log_state_history(struct qlcnic_adapter *adapter)
  39. {
  40. u32 cur, prev;
  41. cur = adapter->ahw->idc.curr_state;
  42. prev = adapter->ahw->idc.prev_state;
  43. dev_info(&adapter->pdev->dev,
  44. "current state = %s, prev state = %s\n",
  45. adapter->ahw->idc.name[cur],
  46. adapter->ahw->idc.name[prev]);
  47. }
  48. static int qlcnic_83xx_idc_update_audit_reg(struct qlcnic_adapter *adapter,
  49. u8 mode, int lock)
  50. {
  51. u32 val;
  52. int seconds;
  53. if (lock) {
  54. if (qlcnic_83xx_lock_driver(adapter))
  55. return -EBUSY;
  56. }
  57. val = adapter->portnum & 0xf;
  58. val |= mode << 7;
  59. if (mode)
  60. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  61. else
  62. seconds = jiffies / HZ;
  63. val |= seconds << 8;
  64. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT, val);
  65. adapter->ahw->idc.sec_counter = jiffies / HZ;
  66. if (lock)
  67. qlcnic_83xx_unlock_driver(adapter);
  68. return 0;
  69. }
  70. static void qlcnic_83xx_idc_update_minor_version(struct qlcnic_adapter *adapter)
  71. {
  72. u32 val;
  73. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION);
  74. val = val & ~(0x3 << (adapter->portnum * 2));
  75. val = val | (QLC_83XX_IDC_MINOR_VERSION << (adapter->portnum * 2));
  76. QLCWRX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION, val);
  77. }
  78. static int qlcnic_83xx_idc_update_major_version(struct qlcnic_adapter *adapter,
  79. int lock)
  80. {
  81. u32 val;
  82. if (lock) {
  83. if (qlcnic_83xx_lock_driver(adapter))
  84. return -EBUSY;
  85. }
  86. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  87. val = val & ~0xFF;
  88. val = val | QLC_83XX_IDC_MAJOR_VERSION;
  89. QLCWRX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION, val);
  90. if (lock)
  91. qlcnic_83xx_unlock_driver(adapter);
  92. return 0;
  93. }
  94. static int
  95. qlcnic_83xx_idc_update_drv_presence_reg(struct qlcnic_adapter *adapter,
  96. int status, int lock)
  97. {
  98. u32 val;
  99. if (lock) {
  100. if (qlcnic_83xx_lock_driver(adapter))
  101. return -EBUSY;
  102. }
  103. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  104. if (status)
  105. val = val | (1 << adapter->portnum);
  106. else
  107. val = val & ~(1 << adapter->portnum);
  108. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  109. qlcnic_83xx_idc_update_minor_version(adapter);
  110. if (lock)
  111. qlcnic_83xx_unlock_driver(adapter);
  112. return 0;
  113. }
  114. static int qlcnic_83xx_idc_check_major_version(struct qlcnic_adapter *adapter)
  115. {
  116. u32 val;
  117. u8 version;
  118. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  119. version = val & 0xFF;
  120. if (version != QLC_83XX_IDC_MAJOR_VERSION) {
  121. dev_info(&adapter->pdev->dev,
  122. "%s:mismatch. version 0x%x, expected version 0x%x\n",
  123. __func__, version, QLC_83XX_IDC_MAJOR_VERSION);
  124. return -EIO;
  125. }
  126. return 0;
  127. }
  128. static int qlcnic_83xx_idc_clear_registers(struct qlcnic_adapter *adapter,
  129. int lock)
  130. {
  131. u32 val;
  132. if (lock) {
  133. if (qlcnic_83xx_lock_driver(adapter))
  134. return -EBUSY;
  135. }
  136. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, 0);
  137. /* Clear gracefull reset bit */
  138. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  139. val &= ~QLC_83XX_IDC_GRACEFULL_RESET;
  140. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  141. if (lock)
  142. qlcnic_83xx_unlock_driver(adapter);
  143. return 0;
  144. }
  145. static int qlcnic_83xx_idc_update_drv_ack_reg(struct qlcnic_adapter *adapter,
  146. int flag, int lock)
  147. {
  148. u32 val;
  149. if (lock) {
  150. if (qlcnic_83xx_lock_driver(adapter))
  151. return -EBUSY;
  152. }
  153. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  154. if (flag)
  155. val = val | (1 << adapter->portnum);
  156. else
  157. val = val & ~(1 << adapter->portnum);
  158. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, val);
  159. if (lock)
  160. qlcnic_83xx_unlock_driver(adapter);
  161. return 0;
  162. }
  163. static int qlcnic_83xx_idc_check_timeout(struct qlcnic_adapter *adapter,
  164. int time_limit)
  165. {
  166. u64 seconds;
  167. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  168. if (seconds <= time_limit)
  169. return 0;
  170. else
  171. return -EBUSY;
  172. }
  173. /**
  174. * qlcnic_83xx_idc_check_reset_ack_reg
  175. *
  176. * @adapter: adapter structure
  177. *
  178. * Check ACK wait limit and clear the functions which failed to ACK
  179. *
  180. * Return 0 if all functions have acknowledged the reset request.
  181. **/
  182. static int qlcnic_83xx_idc_check_reset_ack_reg(struct qlcnic_adapter *adapter)
  183. {
  184. int timeout;
  185. u32 ack, presence, val;
  186. timeout = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  187. ack = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  188. presence = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  189. dev_info(&adapter->pdev->dev,
  190. "%s: ack = 0x%x, presence = 0x%x\n", __func__, ack, presence);
  191. if (!((ack & presence) == presence)) {
  192. if (qlcnic_83xx_idc_check_timeout(adapter, timeout)) {
  193. /* Clear functions which failed to ACK */
  194. dev_info(&adapter->pdev->dev,
  195. "%s: ACK wait exceeds time limit\n", __func__);
  196. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  197. val = val & ~(ack ^ presence);
  198. if (qlcnic_83xx_lock_driver(adapter))
  199. return -EBUSY;
  200. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  201. dev_info(&adapter->pdev->dev,
  202. "%s: updated drv presence reg = 0x%x\n",
  203. __func__, val);
  204. qlcnic_83xx_unlock_driver(adapter);
  205. return 0;
  206. } else {
  207. return 1;
  208. }
  209. } else {
  210. dev_info(&adapter->pdev->dev,
  211. "%s: Reset ACK received from all functions\n",
  212. __func__);
  213. return 0;
  214. }
  215. }
  216. /**
  217. * qlcnic_83xx_idc_tx_soft_reset
  218. *
  219. * @adapter: adapter structure
  220. *
  221. * Handle context deletion and recreation request from transmit routine
  222. *
  223. * Returns -EBUSY or Success (0)
  224. *
  225. **/
  226. static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter)
  227. {
  228. struct net_device *netdev = adapter->netdev;
  229. if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  230. return -EBUSY;
  231. netif_device_detach(netdev);
  232. qlcnic_down(adapter, netdev);
  233. qlcnic_up(adapter, netdev);
  234. netif_device_attach(netdev);
  235. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  236. dev_err(&adapter->pdev->dev, "%s:\n", __func__);
  237. adapter->netdev->trans_start = jiffies;
  238. return 0;
  239. }
  240. /**
  241. * qlcnic_83xx_idc_detach_driver
  242. *
  243. * @adapter: adapter structure
  244. * Detach net interface, stop TX and cleanup resources before the HW reset.
  245. * Returns: None
  246. *
  247. **/
  248. static void qlcnic_83xx_idc_detach_driver(struct qlcnic_adapter *adapter)
  249. {
  250. int i;
  251. struct net_device *netdev = adapter->netdev;
  252. netif_device_detach(netdev);
  253. /* Disable mailbox interrupt */
  254. QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, 0);
  255. qlcnic_down(adapter, netdev);
  256. for (i = 0; i < adapter->ahw->num_msix; i++) {
  257. adapter->ahw->intr_tbl[i].id = i;
  258. adapter->ahw->intr_tbl[i].enabled = 0;
  259. adapter->ahw->intr_tbl[i].src = 0;
  260. }
  261. }
  262. /**
  263. * qlcnic_83xx_idc_attach_driver
  264. *
  265. * @adapter: adapter structure
  266. *
  267. * Re-attach and re-enable net interface
  268. * Returns: None
  269. *
  270. **/
  271. static void qlcnic_83xx_idc_attach_driver(struct qlcnic_adapter *adapter)
  272. {
  273. struct net_device *netdev = adapter->netdev;
  274. if (netif_running(netdev)) {
  275. if (qlcnic_up(adapter, netdev))
  276. goto done;
  277. qlcnic_restore_indev_addr(netdev, NETDEV_UP);
  278. }
  279. done:
  280. netif_device_attach(netdev);
  281. if (netif_running(netdev)) {
  282. netif_carrier_on(netdev);
  283. netif_wake_queue(netdev);
  284. }
  285. }
  286. static int qlcnic_83xx_idc_enter_failed_state(struct qlcnic_adapter *adapter,
  287. int lock)
  288. {
  289. if (lock) {
  290. if (qlcnic_83xx_lock_driver(adapter))
  291. return -EBUSY;
  292. }
  293. qlcnic_83xx_idc_clear_registers(adapter, 0);
  294. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_FAILED);
  295. if (lock)
  296. qlcnic_83xx_unlock_driver(adapter);
  297. qlcnic_83xx_idc_log_state_history(adapter);
  298. dev_info(&adapter->pdev->dev, "Device will enter failed state\n");
  299. return 0;
  300. }
  301. static int qlcnic_83xx_idc_enter_init_state(struct qlcnic_adapter *adapter,
  302. int lock)
  303. {
  304. if (lock) {
  305. if (qlcnic_83xx_lock_driver(adapter))
  306. return -EBUSY;
  307. }
  308. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_INIT);
  309. if (lock)
  310. qlcnic_83xx_unlock_driver(adapter);
  311. return 0;
  312. }
  313. static int qlcnic_83xx_idc_enter_need_quiesce(struct qlcnic_adapter *adapter,
  314. int lock)
  315. {
  316. if (lock) {
  317. if (qlcnic_83xx_lock_driver(adapter))
  318. return -EBUSY;
  319. }
  320. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  321. QLC_83XX_IDC_DEV_NEED_QUISCENT);
  322. if (lock)
  323. qlcnic_83xx_unlock_driver(adapter);
  324. return 0;
  325. }
  326. static int
  327. qlcnic_83xx_idc_enter_need_reset_state(struct qlcnic_adapter *adapter, int lock)
  328. {
  329. if (lock) {
  330. if (qlcnic_83xx_lock_driver(adapter))
  331. return -EBUSY;
  332. }
  333. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  334. QLC_83XX_IDC_DEV_NEED_RESET);
  335. if (lock)
  336. qlcnic_83xx_unlock_driver(adapter);
  337. return 0;
  338. }
  339. static int qlcnic_83xx_idc_enter_ready_state(struct qlcnic_adapter *adapter,
  340. int lock)
  341. {
  342. if (lock) {
  343. if (qlcnic_83xx_lock_driver(adapter))
  344. return -EBUSY;
  345. }
  346. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_READY);
  347. if (lock)
  348. qlcnic_83xx_unlock_driver(adapter);
  349. return 0;
  350. }
  351. /**
  352. * qlcnic_83xx_idc_find_reset_owner_id
  353. *
  354. * @adapter: adapter structure
  355. *
  356. * NIC gets precedence over ISCSI and ISCSI has precedence over FCOE.
  357. * Within the same class, function with lowest PCI ID assumes ownership
  358. *
  359. * Returns: reset owner id or failure indication (-EIO)
  360. *
  361. **/
  362. static int qlcnic_83xx_idc_find_reset_owner_id(struct qlcnic_adapter *adapter)
  363. {
  364. u32 reg, reg1, reg2, i, j, owner, class;
  365. reg1 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_1);
  366. reg2 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_2);
  367. owner = QLCNIC_TYPE_NIC;
  368. i = 0;
  369. j = 0;
  370. reg = reg1;
  371. do {
  372. class = (((reg & (0xF << j * 4)) >> j * 4) & 0x3);
  373. if (class == owner)
  374. break;
  375. if (i == (QLC_83XX_IDC_MAX_FUNC_PER_PARTITION_INFO - 1)) {
  376. reg = reg2;
  377. j = 0;
  378. } else {
  379. j++;
  380. }
  381. if (i == (QLC_83XX_IDC_MAX_CNA_FUNCTIONS - 1)) {
  382. if (owner == QLCNIC_TYPE_NIC)
  383. owner = QLCNIC_TYPE_ISCSI;
  384. else if (owner == QLCNIC_TYPE_ISCSI)
  385. owner = QLCNIC_TYPE_FCOE;
  386. else if (owner == QLCNIC_TYPE_FCOE)
  387. return -EIO;
  388. reg = reg1;
  389. j = 0;
  390. i = 0;
  391. }
  392. } while (i++ < QLC_83XX_IDC_MAX_CNA_FUNCTIONS);
  393. return i;
  394. }
  395. static int qlcnic_83xx_idc_restart_hw(struct qlcnic_adapter *adapter, int lock)
  396. {
  397. int ret = 0;
  398. ret = qlcnic_83xx_restart_hw(adapter);
  399. if (ret) {
  400. qlcnic_83xx_idc_enter_failed_state(adapter, lock);
  401. } else {
  402. qlcnic_83xx_idc_clear_registers(adapter, lock);
  403. ret = qlcnic_83xx_idc_enter_ready_state(adapter, lock);
  404. }
  405. return ret;
  406. }
  407. static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter)
  408. {
  409. u32 status;
  410. status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
  411. if (status & QLCNIC_RCODE_FATAL_ERROR) {
  412. dev_err(&adapter->pdev->dev,
  413. "peg halt status1=0x%x\n", status);
  414. if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
  415. dev_err(&adapter->pdev->dev,
  416. "On board active cooling fan failed. "
  417. "Device has been halted.\n");
  418. dev_err(&adapter->pdev->dev,
  419. "Replace the adapter.\n");
  420. return -EIO;
  421. }
  422. }
  423. return 0;
  424. }
  425. static int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
  426. {
  427. qlcnic_83xx_enable_mbx_intrpt(adapter);
  428. if ((adapter->flags & QLCNIC_MSIX_ENABLED)) {
  429. if (qlcnic_83xx_config_intrpt(adapter, 1)) {
  430. netdev_err(adapter->netdev,
  431. "Failed to enable mbx intr\n");
  432. return -EIO;
  433. }
  434. }
  435. if (qlcnic_83xx_configure_opmode(adapter)) {
  436. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  437. return -EIO;
  438. }
  439. if (adapter->nic_ops->init_driver(adapter)) {
  440. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  441. return -EIO;
  442. }
  443. qlcnic_83xx_idc_attach_driver(adapter);
  444. return 0;
  445. }
  446. static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
  447. {
  448. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 1);
  449. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  450. set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
  451. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  452. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  453. adapter->ahw->idc.quiesce_req = 0;
  454. adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  455. adapter->ahw->idc.err_code = 0;
  456. adapter->ahw->idc.collect_dump = 0;
  457. }
  458. /**
  459. * qlcnic_83xx_idc_ready_state_entry
  460. *
  461. * @adapter: adapter structure
  462. *
  463. * Perform ready state initialization, this routine will get invoked only
  464. * once from READY state.
  465. *
  466. * Returns: Error code or Success(0)
  467. *
  468. **/
  469. int qlcnic_83xx_idc_ready_state_entry(struct qlcnic_adapter *adapter)
  470. {
  471. struct qlcnic_hardware_context *ahw = adapter->ahw;
  472. if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_READY) {
  473. qlcnic_83xx_idc_update_idc_params(adapter);
  474. /* Re-attach the device if required */
  475. if ((ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) ||
  476. (ahw->idc.prev_state == QLC_83XX_IDC_DEV_INIT)) {
  477. if (qlcnic_83xx_idc_reattach_driver(adapter))
  478. return -EIO;
  479. }
  480. }
  481. return 0;
  482. }
  483. static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter)
  484. {
  485. adapter->ahw->idc.err_code = -EIO;
  486. dev_err(&adapter->pdev->dev,
  487. "%s: Device in unknown state\n", __func__);
  488. return 0;
  489. }
  490. /**
  491. * qlcnic_83xx_idc_cold_state
  492. *
  493. * @adapter: adapter structure
  494. *
  495. * If HW is up and running device will enter READY state.
  496. * If firmware image from host needs to be loaded, device is
  497. * forced to start with the file firmware image.
  498. *
  499. * Returns: Error code or Success(0)
  500. *
  501. **/
  502. static int qlcnic_83xx_idc_cold_state_handler(struct qlcnic_adapter *adapter)
  503. {
  504. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 0);
  505. qlcnic_83xx_idc_update_audit_reg(adapter, 1, 0);
  506. if (qlcnic_load_fw_file) {
  507. qlcnic_83xx_idc_restart_hw(adapter, 0);
  508. } else {
  509. if (qlcnic_83xx_check_hw_status(adapter)) {
  510. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  511. return -EIO;
  512. } else {
  513. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  514. }
  515. }
  516. return 0;
  517. }
  518. /**
  519. * qlcnic_83xx_idc_init_state
  520. *
  521. * @adapter: adapter structure
  522. *
  523. * Reset owner will restart the device from this state.
  524. * Device will enter failed state if it remains
  525. * in this state for more than DEV_INIT time limit.
  526. *
  527. * Returns: Error code or Success(0)
  528. *
  529. **/
  530. static int qlcnic_83xx_idc_init_state(struct qlcnic_adapter *adapter)
  531. {
  532. int timeout, ret = 0;
  533. u32 owner;
  534. timeout = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  535. if (adapter->ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) {
  536. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  537. if (adapter->ahw->pci_func == owner)
  538. ret = qlcnic_83xx_idc_restart_hw(adapter, 1);
  539. } else {
  540. ret = qlcnic_83xx_idc_check_timeout(adapter, timeout);
  541. return ret;
  542. }
  543. return ret;
  544. }
  545. /**
  546. * qlcnic_83xx_idc_ready_state
  547. *
  548. * @adapter: adapter structure
  549. *
  550. * Perform IDC protocol specicifed actions after monitoring device state and
  551. * events.
  552. *
  553. * Returns: Error code or Success(0)
  554. *
  555. **/
  556. static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter)
  557. {
  558. u32 val;
  559. struct qlcnic_hardware_context *ahw = adapter->ahw;
  560. int ret = 0;
  561. /* Perform NIC configuration based ready state entry actions */
  562. if (ahw->idc.state_entry(adapter))
  563. return -EIO;
  564. if (qlcnic_check_temp(adapter)) {
  565. if (ahw->temp == QLCNIC_TEMP_PANIC) {
  566. qlcnic_83xx_idc_check_fan_failure(adapter);
  567. dev_err(&adapter->pdev->dev,
  568. "Error: device temperature %d above limits\n",
  569. adapter->ahw->temp);
  570. clear_bit(QLC_83XX_MBX_READY, &ahw->idc.status);
  571. set_bit(__QLCNIC_RESETTING, &adapter->state);
  572. qlcnic_83xx_idc_detach_driver(adapter);
  573. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  574. return -EIO;
  575. }
  576. }
  577. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  578. ret = qlcnic_83xx_check_heartbeat(adapter);
  579. if (ret) {
  580. adapter->flags |= QLCNIC_FW_HANG;
  581. if (!(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  582. clear_bit(QLC_83XX_MBX_READY, &ahw->idc.status);
  583. set_bit(__QLCNIC_RESETTING, &adapter->state);
  584. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  585. }
  586. return -EIO;
  587. }
  588. if ((val & QLC_83XX_IDC_GRACEFULL_RESET) || ahw->idc.collect_dump) {
  589. /* Move to need reset state and prepare for reset */
  590. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  591. return ret;
  592. }
  593. /* Check for soft reset request */
  594. if (ahw->reset_context &&
  595. !(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  596. qlcnic_83xx_idc_tx_soft_reset(adapter);
  597. return ret;
  598. }
  599. /* Move to need quiesce state if requested */
  600. if (adapter->ahw->idc.quiesce_req) {
  601. qlcnic_83xx_idc_enter_need_quiesce(adapter, 1);
  602. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  603. return ret;
  604. }
  605. return ret;
  606. }
  607. /**
  608. * qlcnic_83xx_idc_need_reset_state
  609. *
  610. * @adapter: adapter structure
  611. *
  612. * Device will remain in this state until:
  613. * Reset request ACK's are recieved from all the functions
  614. * Wait time exceeds max time limit
  615. *
  616. * Returns: Error code or Success(0)
  617. *
  618. **/
  619. static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
  620. {
  621. int ret = 0;
  622. if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
  623. qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
  624. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  625. set_bit(__QLCNIC_RESETTING, &adapter->state);
  626. clear_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
  627. qlcnic_83xx_idc_detach_driver(adapter);
  628. }
  629. /* Check ACK from other functions */
  630. ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
  631. if (ret) {
  632. dev_info(&adapter->pdev->dev,
  633. "%s: Waiting for reset ACK\n", __func__);
  634. return 0;
  635. }
  636. /* Transit to INIT state and restart the HW */
  637. qlcnic_83xx_idc_enter_init_state(adapter, 1);
  638. return ret;
  639. }
  640. static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter)
  641. {
  642. dev_err(&adapter->pdev->dev, "%s: TBD\n", __func__);
  643. return 0;
  644. }
  645. static int qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter)
  646. {
  647. dev_err(&adapter->pdev->dev, "%s: please restart!!\n", __func__);
  648. adapter->ahw->idc.err_code = -EIO;
  649. return 0;
  650. }
  651. static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter)
  652. {
  653. dev_info(&adapter->pdev->dev, "%s: TBD\n", __func__);
  654. return 0;
  655. }
  656. static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
  657. u32 state)
  658. {
  659. u32 cur, prev, next;
  660. cur = adapter->ahw->idc.curr_state;
  661. prev = adapter->ahw->idc.prev_state;
  662. next = state;
  663. if ((next < QLC_83XX_IDC_DEV_COLD) ||
  664. (next > QLC_83XX_IDC_DEV_QUISCENT)) {
  665. dev_err(&adapter->pdev->dev,
  666. "%s: curr %d, prev %d, next state %d is invalid\n",
  667. __func__, cur, prev, state);
  668. return 1;
  669. }
  670. if ((cur == QLC_83XX_IDC_DEV_UNKNOWN) &&
  671. (prev == QLC_83XX_IDC_DEV_UNKNOWN)) {
  672. if ((next != QLC_83XX_IDC_DEV_COLD) &&
  673. (next != QLC_83XX_IDC_DEV_READY)) {
  674. dev_err(&adapter->pdev->dev,
  675. "%s: failed, cur %d prev %d next %d\n",
  676. __func__, cur, prev, next);
  677. return 1;
  678. }
  679. }
  680. if (next == QLC_83XX_IDC_DEV_INIT) {
  681. if ((prev != QLC_83XX_IDC_DEV_INIT) &&
  682. (prev != QLC_83XX_IDC_DEV_COLD) &&
  683. (prev != QLC_83XX_IDC_DEV_NEED_RESET)) {
  684. dev_err(&adapter->pdev->dev,
  685. "%s: failed, cur %d prev %d next %d\n",
  686. __func__, cur, prev, next);
  687. return 1;
  688. }
  689. }
  690. return 0;
  691. }
  692. static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
  693. {
  694. if (adapter->fhash.fnum)
  695. qlcnic_prune_lb_filters(adapter);
  696. }
  697. /**
  698. * qlcnic_83xx_idc_poll_dev_state
  699. *
  700. * @work: kernel work queue structure used to schedule the function
  701. *
  702. * Poll device state periodically and perform state specific
  703. * actions defined by Inter Driver Communication (IDC) protocol.
  704. *
  705. * Returns: None
  706. *
  707. **/
  708. void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work)
  709. {
  710. struct qlcnic_adapter *adapter;
  711. u32 state;
  712. adapter = container_of(work, struct qlcnic_adapter, fw_work.work);
  713. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  714. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  715. qlcnic_83xx_idc_log_state_history(adapter);
  716. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  717. } else {
  718. adapter->ahw->idc.curr_state = state;
  719. }
  720. switch (adapter->ahw->idc.curr_state) {
  721. case QLC_83XX_IDC_DEV_READY:
  722. qlcnic_83xx_idc_ready_state(adapter);
  723. break;
  724. case QLC_83XX_IDC_DEV_NEED_RESET:
  725. qlcnic_83xx_idc_need_reset_state(adapter);
  726. break;
  727. case QLC_83XX_IDC_DEV_NEED_QUISCENT:
  728. qlcnic_83xx_idc_need_quiesce_state(adapter);
  729. break;
  730. case QLC_83XX_IDC_DEV_FAILED:
  731. qlcnic_83xx_idc_failed_state(adapter);
  732. return;
  733. case QLC_83XX_IDC_DEV_INIT:
  734. qlcnic_83xx_idc_init_state(adapter);
  735. break;
  736. case QLC_83XX_IDC_DEV_QUISCENT:
  737. qlcnic_83xx_idc_quiesce_state(adapter);
  738. break;
  739. default:
  740. qlcnic_83xx_idc_unknown_state(adapter);
  741. return;
  742. }
  743. adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state;
  744. qlcnic_83xx_periodic_tasks(adapter);
  745. /* Re-schedule the function */
  746. if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status))
  747. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
  748. adapter->ahw->idc.delay);
  749. }
  750. static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter)
  751. {
  752. u32 idc_params, val;
  753. if (qlcnic_83xx_lockless_flash_read32(adapter,
  754. QLC_83XX_IDC_FLASH_PARAM_ADDR,
  755. (u8 *)&idc_params, 1)) {
  756. dev_info(&adapter->pdev->dev,
  757. "%s:failed to get IDC params from flash\n", __func__);
  758. adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  759. adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  760. } else {
  761. adapter->dev_init_timeo = idc_params & 0xFFFF;
  762. adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF);
  763. }
  764. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  765. adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN;
  766. adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  767. adapter->ahw->idc.err_code = 0;
  768. adapter->ahw->idc.collect_dump = 0;
  769. adapter->ahw->idc.name = (char **)qlc_83xx_idc_states;
  770. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  771. set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
  772. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  773. /* Check if reset recovery is disabled */
  774. if (!qlcnic_auto_fw_reset) {
  775. /* Propagate do not reset request to other functions */
  776. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  777. val = val | QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  778. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  779. }
  780. }
  781. static int
  782. qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
  783. {
  784. u32 state, val;
  785. if (qlcnic_83xx_lock_driver(adapter))
  786. return -EIO;
  787. /* Clear driver lock register */
  788. QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0);
  789. if (qlcnic_83xx_idc_update_major_version(adapter, 0)) {
  790. qlcnic_83xx_unlock_driver(adapter);
  791. return -EIO;
  792. }
  793. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  794. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  795. qlcnic_83xx_unlock_driver(adapter);
  796. return -EIO;
  797. }
  798. if (state != QLC_83XX_IDC_DEV_COLD && qlcnic_load_fw_file) {
  799. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  800. QLC_83XX_IDC_DEV_COLD);
  801. state = QLC_83XX_IDC_DEV_COLD;
  802. }
  803. adapter->ahw->idc.curr_state = state;
  804. /* First to load function should cold boot the device */
  805. if (state == QLC_83XX_IDC_DEV_COLD)
  806. qlcnic_83xx_idc_cold_state_handler(adapter);
  807. /* Check if reset recovery is enabled */
  808. if (qlcnic_auto_fw_reset) {
  809. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  810. val = val & ~QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  811. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  812. }
  813. qlcnic_83xx_unlock_driver(adapter);
  814. return 0;
  815. }
  816. static int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
  817. {
  818. qlcnic_83xx_setup_idc_parameters(adapter);
  819. if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) {
  820. if (qlcnic_83xx_idc_first_to_load_function_handler(adapter))
  821. return -EIO;
  822. } else {
  823. if (qlcnic_83xx_idc_check_major_version(adapter))
  824. return -EIO;
  825. }
  826. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  827. return 0;
  828. }
  829. void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter)
  830. {
  831. int id;
  832. u32 val;
  833. while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  834. usleep_range(10000, 11000);
  835. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  836. id = id & 0xFF;
  837. if (id == adapter->portnum) {
  838. dev_err(&adapter->pdev->dev,
  839. "%s: wait for lock recovery.. %d\n", __func__, id);
  840. msleep(20);
  841. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  842. id = id & 0xFF;
  843. }
  844. /* Clear driver presence bit */
  845. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  846. val = val & ~(1 << adapter->portnum);
  847. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  848. clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  849. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  850. cancel_delayed_work_sync(&adapter->fw_work);
  851. }
  852. void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key)
  853. {
  854. u32 val;
  855. if (qlcnic_83xx_lock_driver(adapter)) {
  856. dev_err(&adapter->pdev->dev,
  857. "%s:failed, please retry\n", __func__);
  858. return;
  859. }
  860. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  861. if ((val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) ||
  862. !qlcnic_auto_fw_reset) {
  863. dev_err(&adapter->pdev->dev,
  864. "%s:failed, device in non reset mode\n", __func__);
  865. qlcnic_83xx_unlock_driver(adapter);
  866. return;
  867. }
  868. if (key == QLCNIC_FORCE_FW_RESET) {
  869. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  870. val = val | QLC_83XX_IDC_GRACEFULL_RESET;
  871. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  872. } else if (key == QLCNIC_FORCE_FW_DUMP_KEY) {
  873. adapter->ahw->idc.collect_dump = 1;
  874. }
  875. qlcnic_83xx_unlock_driver(adapter);
  876. return;
  877. }
  878. static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
  879. {
  880. u8 *p_cache;
  881. u32 src, size;
  882. u64 dest;
  883. int ret = -EIO;
  884. src = QLC_83XX_BOOTLOADER_FLASH_ADDR;
  885. dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR);
  886. size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE);
  887. /* alignment check */
  888. if (size & 0xF)
  889. size = (size + 16) & ~0xF;
  890. p_cache = kzalloc(size, GFP_KERNEL);
  891. if (p_cache == NULL) {
  892. dev_err(&adapter->pdev->dev,
  893. "Failed to allocate memory for boot loader cache\n");
  894. return -ENOMEM;
  895. }
  896. ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache,
  897. size / sizeof(u32));
  898. if (ret) {
  899. kfree(p_cache);
  900. return ret;
  901. }
  902. /* 16 byte write to MS memory */
  903. ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache,
  904. size / 16);
  905. if (ret) {
  906. kfree(p_cache);
  907. return ret;
  908. }
  909. kfree(p_cache);
  910. return ret;
  911. }
  912. static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
  913. {
  914. u32 dest, *p_cache;
  915. u64 addr;
  916. u8 data[16];
  917. size_t size;
  918. int i, ret = -EIO;
  919. dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
  920. size = (adapter->ahw->fw_info.fw->size & ~0xF);
  921. p_cache = (u32 *)adapter->ahw->fw_info.fw->data;
  922. addr = (u64)dest;
  923. ret = qlcnic_83xx_ms_mem_write128(adapter, addr,
  924. (u32 *)p_cache, size / 16);
  925. if (ret) {
  926. dev_err(&adapter->pdev->dev, "MS memory write failed\n");
  927. release_firmware(adapter->ahw->fw_info.fw);
  928. adapter->ahw->fw_info.fw = NULL;
  929. return -EIO;
  930. }
  931. /* alignment check */
  932. if (adapter->ahw->fw_info.fw->size & 0xF) {
  933. addr = dest + size;
  934. for (i = 0; i < (adapter->ahw->fw_info.fw->size & 0xF); i++)
  935. data[i] = adapter->ahw->fw_info.fw->data[size + i];
  936. for (; i < 16; i++)
  937. data[i] = 0;
  938. ret = qlcnic_83xx_ms_mem_write128(adapter, addr,
  939. (u32 *)data, 1);
  940. if (ret) {
  941. dev_err(&adapter->pdev->dev,
  942. "MS memory write failed\n");
  943. release_firmware(adapter->ahw->fw_info.fw);
  944. adapter->ahw->fw_info.fw = NULL;
  945. return -EIO;
  946. }
  947. }
  948. release_firmware(adapter->ahw->fw_info.fw);
  949. adapter->ahw->fw_info.fw = NULL;
  950. return 0;
  951. }
  952. static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
  953. {
  954. int i, j;
  955. u32 val = 0, val1 = 0, reg = 0;
  956. val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG);
  957. dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
  958. for (j = 0; j < 2; j++) {
  959. if (j == 0) {
  960. dev_info(&adapter->pdev->dev,
  961. "Port 0 RxB Pause Threshold Regs[TC7..TC0]:");
  962. reg = QLC_83XX_PORT0_THRESHOLD;
  963. } else if (j == 1) {
  964. dev_info(&adapter->pdev->dev,
  965. "Port 1 RxB Pause Threshold Regs[TC7..TC0]:");
  966. reg = QLC_83XX_PORT1_THRESHOLD;
  967. }
  968. for (i = 0; i < 8; i++) {
  969. val = QLCRD32(adapter, reg + (i * 0x4));
  970. dev_info(&adapter->pdev->dev, "0x%x ", val);
  971. }
  972. dev_info(&adapter->pdev->dev, "\n");
  973. }
  974. for (j = 0; j < 2; j++) {
  975. if (j == 0) {
  976. dev_info(&adapter->pdev->dev,
  977. "Port 0 RxB TC Max Cell Registers[4..1]:");
  978. reg = QLC_83XX_PORT0_TC_MC_REG;
  979. } else if (j == 1) {
  980. dev_info(&adapter->pdev->dev,
  981. "Port 1 RxB TC Max Cell Registers[4..1]:");
  982. reg = QLC_83XX_PORT1_TC_MC_REG;
  983. }
  984. for (i = 0; i < 4; i++) {
  985. val = QLCRD32(adapter, reg + (i * 0x4));
  986. dev_info(&adapter->pdev->dev, "0x%x ", val);
  987. }
  988. dev_info(&adapter->pdev->dev, "\n");
  989. }
  990. for (j = 0; j < 2; j++) {
  991. if (j == 0) {
  992. dev_info(&adapter->pdev->dev,
  993. "Port 0 RxB Rx TC Stats[TC7..TC0]:");
  994. reg = QLC_83XX_PORT0_TC_STATS;
  995. } else if (j == 1) {
  996. dev_info(&adapter->pdev->dev,
  997. "Port 1 RxB Rx TC Stats[TC7..TC0]:");
  998. reg = QLC_83XX_PORT1_TC_STATS;
  999. }
  1000. for (i = 7; i >= 0; i--) {
  1001. val = QLCRD32(adapter, reg);
  1002. val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
  1003. QLCWR32(adapter, reg, (val | (i << 29)));
  1004. val = QLCRD32(adapter, reg);
  1005. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1006. }
  1007. dev_info(&adapter->pdev->dev, "\n");
  1008. }
  1009. val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD);
  1010. val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD);
  1011. dev_info(&adapter->pdev->dev,
  1012. "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
  1013. val, val1);
  1014. }
  1015. static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
  1016. {
  1017. u32 reg = 0, i, j;
  1018. if (qlcnic_83xx_lock_driver(adapter)) {
  1019. dev_err(&adapter->pdev->dev,
  1020. "%s:failed to acquire driver lock\n", __func__);
  1021. return;
  1022. }
  1023. qlcnic_83xx_dump_pause_control_regs(adapter);
  1024. QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0);
  1025. for (j = 0; j < 2; j++) {
  1026. if (j == 0)
  1027. reg = QLC_83XX_PORT0_THRESHOLD;
  1028. else if (j == 1)
  1029. reg = QLC_83XX_PORT1_THRESHOLD;
  1030. for (i = 0; i < 8; i++)
  1031. QLCWR32(adapter, reg + (i * 0x4), 0x0);
  1032. }
  1033. for (j = 0; j < 2; j++) {
  1034. if (j == 0)
  1035. reg = QLC_83XX_PORT0_TC_MC_REG;
  1036. else if (j == 1)
  1037. reg = QLC_83XX_PORT1_TC_MC_REG;
  1038. for (i = 0; i < 4; i++)
  1039. QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF);
  1040. }
  1041. QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0);
  1042. QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0);
  1043. dev_info(&adapter->pdev->dev,
  1044. "Disabled pause frames successfully on all ports\n");
  1045. qlcnic_83xx_unlock_driver(adapter);
  1046. }
  1047. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
  1048. {
  1049. u32 heartbeat, peg_status;
  1050. int retries, ret = -EIO;
  1051. retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
  1052. p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1053. QLCNIC_PEG_ALIVE_COUNTER);
  1054. do {
  1055. msleep(QLCNIC_HEARTBEAT_PERIOD_MSECS);
  1056. heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1057. QLCNIC_PEG_ALIVE_COUNTER);
  1058. if (heartbeat != p_dev->heartbeat) {
  1059. ret = QLCNIC_RCODE_SUCCESS;
  1060. break;
  1061. }
  1062. } while (--retries);
  1063. if (ret) {
  1064. dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
  1065. qlcnic_83xx_disable_pause_frames(p_dev);
  1066. peg_status = QLC_SHARED_REG_RD32(p_dev,
  1067. QLCNIC_PEG_HALT_STATUS1);
  1068. dev_info(&p_dev->pdev->dev, "Dumping HW/FW registers\n"
  1069. "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
  1070. "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
  1071. "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
  1072. "PEG_NET_4_PC: 0x%x\n", peg_status,
  1073. QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
  1074. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0),
  1075. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1),
  1076. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2),
  1077. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3),
  1078. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4));
  1079. if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
  1080. dev_err(&p_dev->pdev->dev,
  1081. "Device is being reset err code 0x00006700.\n");
  1082. }
  1083. return ret;
  1084. }
  1085. static int qlcnic_83xx_check_cmd_peg_status(struct qlcnic_adapter *p_dev)
  1086. {
  1087. int retries = QLCNIC_CMDPEG_CHECK_RETRY_COUNT;
  1088. u32 val;
  1089. do {
  1090. val = QLC_SHARED_REG_RD32(p_dev, QLCNIC_CMDPEG_STATE);
  1091. if (val == QLC_83XX_CMDPEG_COMPLETE)
  1092. return 0;
  1093. msleep(QLCNIC_CMDPEG_CHECK_DELAY);
  1094. } while (--retries);
  1095. dev_err(&p_dev->pdev->dev, "%s: failed, state = 0x%x\n", __func__, val);
  1096. return -EIO;
  1097. }
  1098. int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
  1099. {
  1100. int err;
  1101. err = qlcnic_83xx_check_cmd_peg_status(p_dev);
  1102. if (err)
  1103. return err;
  1104. err = qlcnic_83xx_check_heartbeat(p_dev);
  1105. if (err)
  1106. return err;
  1107. return err;
  1108. }
  1109. static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
  1110. {
  1111. int err = -EIO;
  1112. if (request_firmware(&adapter->ahw->fw_info.fw,
  1113. QLC_83XX_FW_FILE_NAME, &(adapter->pdev->dev))) {
  1114. dev_err(&adapter->pdev->dev,
  1115. "No file FW image, loading flash FW image.\n");
  1116. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1117. QLC_83XX_BOOT_FROM_FLASH);
  1118. } else {
  1119. if (qlcnic_83xx_copy_fw_file(adapter))
  1120. return err;
  1121. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1122. QLC_83XX_BOOT_FROM_FILE);
  1123. }
  1124. return 0;
  1125. }
  1126. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
  1127. {
  1128. int err = -EIO;
  1129. if (qlcnic_83xx_copy_bootloader(adapter))
  1130. return err;
  1131. /* Boot either flash image or firmware image from host file system */
  1132. if (qlcnic_load_fw_file) {
  1133. if (qlcnic_83xx_load_fw_image_from_host(adapter))
  1134. return err;
  1135. } else {
  1136. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1137. QLC_83XX_BOOT_FROM_FLASH);
  1138. }
  1139. if (qlcnic_83xx_check_hw_status(adapter))
  1140. return -EIO;
  1141. return 0;
  1142. }
  1143. /**
  1144. * qlcnic_83xx_config_default_opmode
  1145. *
  1146. * @adapter: adapter structure
  1147. *
  1148. * Configure default driver operating mode
  1149. *
  1150. * Returns: Error code or Success(0)
  1151. * */
  1152. int qlcnic_83xx_config_default_opmode(struct qlcnic_adapter *adapter)
  1153. {
  1154. u32 op_mode;
  1155. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1156. qlcnic_get_func_no(adapter);
  1157. op_mode = QLCRDX(ahw, QLC_83XX_DRV_OP_MODE);
  1158. if (op_mode == QLC_83XX_DEFAULT_OPMODE) {
  1159. adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
  1160. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  1161. } else {
  1162. return -EIO;
  1163. }
  1164. return 0;
  1165. }
  1166. int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
  1167. {
  1168. int err;
  1169. struct qlcnic_info nic_info;
  1170. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1171. memset(&nic_info, 0, sizeof(struct qlcnic_info));
  1172. err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func);
  1173. if (err)
  1174. return -EIO;
  1175. ahw->physical_port = (u8) nic_info.phys_port;
  1176. ahw->switch_mode = nic_info.switch_mode;
  1177. ahw->max_tx_ques = nic_info.max_tx_ques;
  1178. ahw->max_rx_ques = nic_info.max_rx_ques;
  1179. ahw->capabilities = nic_info.capabilities;
  1180. ahw->max_mac_filters = nic_info.max_mac_filters;
  1181. ahw->max_mtu = nic_info.max_mtu;
  1182. if (ahw->capabilities & BIT_23)
  1183. ahw->nic_mode = QLC_83XX_VIRTUAL_NIC_MODE;
  1184. else
  1185. ahw->nic_mode = QLC_83XX_DEFAULT_MODE;
  1186. return ahw->nic_mode;
  1187. }
  1188. static int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
  1189. {
  1190. int ret;
  1191. ret = qlcnic_83xx_get_nic_configuration(adapter);
  1192. if (ret == -EIO)
  1193. return -EIO;
  1194. if (ret == QLC_83XX_DEFAULT_MODE) {
  1195. if (qlcnic_83xx_config_default_opmode(adapter))
  1196. return -EIO;
  1197. }
  1198. return 0;
  1199. }
  1200. static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter)
  1201. {
  1202. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1203. if (ahw->port_type == QLCNIC_XGBE) {
  1204. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
  1205. adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
  1206. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1207. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1208. } else if (ahw->port_type == QLCNIC_GBE) {
  1209. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
  1210. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1211. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1212. adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
  1213. }
  1214. adapter->num_txd = MAX_CMD_DESCRIPTORS;
  1215. adapter->max_rds_rings = MAX_RDS_RINGS;
  1216. }
  1217. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter)
  1218. {
  1219. int err = -EIO;
  1220. if (qlcnic_83xx_get_port_info(adapter))
  1221. return err;
  1222. qlcnic_83xx_config_buff_descriptors(adapter);
  1223. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  1224. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  1225. dev_info(&adapter->pdev->dev, "HAL Version: %d\n",
  1226. adapter->ahw->fw_hal_version);
  1227. return 0;
  1228. }
  1229. #define IS_QLC_83XX_USED(a, b, c) (((1 << a->portnum) & b) || ((c >> 6) & 0x1))
  1230. static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
  1231. {
  1232. struct qlcnic_cmd_args cmd;
  1233. u32 presence_mask, audit_mask;
  1234. int status;
  1235. presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  1236. audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  1237. if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
  1238. qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_STOP_NIC_FUNC);
  1239. cmd.req.arg[1] = BIT_31;
  1240. status = qlcnic_issue_cmd(adapter, &cmd);
  1241. if (status)
  1242. dev_err(&adapter->pdev->dev,
  1243. "Failed to clean up the function resources\n");
  1244. qlcnic_free_mbx_args(&cmd);
  1245. }
  1246. }
  1247. int qlcnic_83xx_init(struct qlcnic_adapter *adapter)
  1248. {
  1249. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1250. if (qlcnic_83xx_check_hw_status(adapter))
  1251. return -EIO;
  1252. /* Initilaize 83xx mailbox spinlock */
  1253. spin_lock_init(&ahw->mbx_lock);
  1254. set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
  1255. qlcnic_83xx_clear_function_resources(adapter);
  1256. if (!qlcnic_83xx_read_flash_descriptor_table(adapter))
  1257. qlcnic_83xx_read_flash_mfg_id(adapter);
  1258. if (qlcnic_83xx_idc_init(adapter))
  1259. return -EIO;
  1260. /* Configure default, SR-IOV or Virtual NIC mode of operation */
  1261. if (qlcnic_83xx_configure_opmode(adapter))
  1262. return -EIO;
  1263. /* Perform operating mode specific initialization */
  1264. if (adapter->nic_ops->init_driver(adapter))
  1265. return -EIO;
  1266. INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
  1267. /* register for NIC IDC AEN Events */
  1268. qlcnic_83xx_register_nic_idc_func(adapter, 1);
  1269. /* Periodically monitor device status */
  1270. qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
  1271. return adapter->ahw->idc.err_code;
  1272. }