qlcnic_83xx_init.c 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448
  1. /*
  2. * QLogic qlcnic NIC Driver
  3. * Copyright (c) 2009-2013 QLogic Corporation
  4. *
  5. * See LICENSE.qlcnic for copyright and licensing details.
  6. */
  7. #include "qlcnic_sriov.h"
  8. #include "qlcnic.h"
  9. #include "qlcnic_hw.h"
  10. /* Reset template definitions */
  11. #define QLC_83XX_RESTART_TEMPLATE_SIZE 0x2000
  12. #define QLC_83XX_RESET_TEMPLATE_ADDR 0x4F0000
  13. #define QLC_83XX_RESET_SEQ_VERSION 0x0101
  14. #define QLC_83XX_OPCODE_NOP 0x0000
  15. #define QLC_83XX_OPCODE_WRITE_LIST 0x0001
  16. #define QLC_83XX_OPCODE_READ_WRITE_LIST 0x0002
  17. #define QLC_83XX_OPCODE_POLL_LIST 0x0004
  18. #define QLC_83XX_OPCODE_POLL_WRITE_LIST 0x0008
  19. #define QLC_83XX_OPCODE_READ_MODIFY_WRITE 0x0010
  20. #define QLC_83XX_OPCODE_SEQ_PAUSE 0x0020
  21. #define QLC_83XX_OPCODE_SEQ_END 0x0040
  22. #define QLC_83XX_OPCODE_TMPL_END 0x0080
  23. #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100
  24. /* EPORT control registers */
  25. #define QLC_83XX_RESET_CONTROL 0x28084E50
  26. #define QLC_83XX_RESET_REG 0x28084E60
  27. #define QLC_83XX_RESET_PORT0 0x28084E70
  28. #define QLC_83XX_RESET_PORT1 0x28084E80
  29. #define QLC_83XX_RESET_PORT2 0x28084E90
  30. #define QLC_83XX_RESET_PORT3 0x28084EA0
  31. #define QLC_83XX_RESET_SRESHIM 0x28084EB0
  32. #define QLC_83XX_RESET_EPGSHIM 0x28084EC0
  33. #define QLC_83XX_RESET_ETHERPCS 0x28084ED0
  34. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
  35. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
  36. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
  37. static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev);
  38. static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *);
  39. static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *);
  40. /* Template header */
  41. struct qlc_83xx_reset_hdr {
  42. #if defined(__LITTLE_ENDIAN)
  43. u16 version;
  44. u16 signature;
  45. u16 size;
  46. u16 entries;
  47. u16 hdr_size;
  48. u16 checksum;
  49. u16 init_offset;
  50. u16 start_offset;
  51. #elif defined(__BIG_ENDIAN)
  52. u16 signature;
  53. u16 version;
  54. u16 entries;
  55. u16 size;
  56. u16 checksum;
  57. u16 hdr_size;
  58. u16 start_offset;
  59. u16 init_offset;
  60. #endif
  61. } __packed;
  62. /* Command entry header. */
  63. struct qlc_83xx_entry_hdr {
  64. #if defined(__LITTLE_ENDIAN)
  65. u16 cmd;
  66. u16 size;
  67. u16 count;
  68. u16 delay;
  69. #elif defined(__BIG_ENDIAN)
  70. u16 size;
  71. u16 cmd;
  72. u16 delay;
  73. u16 count;
  74. #endif
  75. } __packed;
  76. /* Generic poll command */
  77. struct qlc_83xx_poll {
  78. u32 mask;
  79. u32 status;
  80. } __packed;
  81. /* Read modify write command */
  82. struct qlc_83xx_rmw {
  83. u32 mask;
  84. u32 xor_value;
  85. u32 or_value;
  86. #if defined(__LITTLE_ENDIAN)
  87. u8 shl;
  88. u8 shr;
  89. u8 index_a;
  90. u8 rsvd;
  91. #elif defined(__BIG_ENDIAN)
  92. u8 rsvd;
  93. u8 index_a;
  94. u8 shr;
  95. u8 shl;
  96. #endif
  97. } __packed;
  98. /* Generic command with 2 DWORD */
  99. struct qlc_83xx_entry {
  100. u32 arg1;
  101. u32 arg2;
  102. } __packed;
  103. /* Generic command with 4 DWORD */
  104. struct qlc_83xx_quad_entry {
  105. u32 dr_addr;
  106. u32 dr_value;
  107. u32 ar_addr;
  108. u32 ar_value;
  109. } __packed;
  110. static const char *const qlc_83xx_idc_states[] = {
  111. "Unknown",
  112. "Cold",
  113. "Init",
  114. "Ready",
  115. "Need Reset",
  116. "Need Quiesce",
  117. "Failed",
  118. "Quiesce"
  119. };
  120. static int
  121. qlcnic_83xx_idc_check_driver_presence_reg(struct qlcnic_adapter *adapter)
  122. {
  123. u32 val;
  124. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  125. if ((val & 0xFFFF))
  126. return 1;
  127. else
  128. return 0;
  129. }
  130. static void qlcnic_83xx_idc_log_state_history(struct qlcnic_adapter *adapter)
  131. {
  132. u32 cur, prev;
  133. cur = adapter->ahw->idc.curr_state;
  134. prev = adapter->ahw->idc.prev_state;
  135. dev_info(&adapter->pdev->dev,
  136. "current state = %s, prev state = %s\n",
  137. adapter->ahw->idc.name[cur],
  138. adapter->ahw->idc.name[prev]);
  139. }
  140. static int qlcnic_83xx_idc_update_audit_reg(struct qlcnic_adapter *adapter,
  141. u8 mode, int lock)
  142. {
  143. u32 val;
  144. int seconds;
  145. if (lock) {
  146. if (qlcnic_83xx_lock_driver(adapter))
  147. return -EBUSY;
  148. }
  149. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  150. val |= (adapter->portnum & 0xf);
  151. val |= mode << 7;
  152. if (mode)
  153. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  154. else
  155. seconds = jiffies / HZ;
  156. val |= seconds << 8;
  157. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT, val);
  158. adapter->ahw->idc.sec_counter = jiffies / HZ;
  159. if (lock)
  160. qlcnic_83xx_unlock_driver(adapter);
  161. return 0;
  162. }
  163. static void qlcnic_83xx_idc_update_minor_version(struct qlcnic_adapter *adapter)
  164. {
  165. u32 val;
  166. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION);
  167. val = val & ~(0x3 << (adapter->portnum * 2));
  168. val = val | (QLC_83XX_IDC_MINOR_VERSION << (adapter->portnum * 2));
  169. QLCWRX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION, val);
  170. }
  171. static int qlcnic_83xx_idc_update_major_version(struct qlcnic_adapter *adapter,
  172. int lock)
  173. {
  174. u32 val;
  175. if (lock) {
  176. if (qlcnic_83xx_lock_driver(adapter))
  177. return -EBUSY;
  178. }
  179. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  180. val = val & ~0xFF;
  181. val = val | QLC_83XX_IDC_MAJOR_VERSION;
  182. QLCWRX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION, val);
  183. if (lock)
  184. qlcnic_83xx_unlock_driver(adapter);
  185. return 0;
  186. }
  187. static int
  188. qlcnic_83xx_idc_update_drv_presence_reg(struct qlcnic_adapter *adapter,
  189. int status, int lock)
  190. {
  191. u32 val;
  192. if (lock) {
  193. if (qlcnic_83xx_lock_driver(adapter))
  194. return -EBUSY;
  195. }
  196. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  197. if (status)
  198. val = val | (1 << adapter->portnum);
  199. else
  200. val = val & ~(1 << adapter->portnum);
  201. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  202. qlcnic_83xx_idc_update_minor_version(adapter);
  203. if (lock)
  204. qlcnic_83xx_unlock_driver(adapter);
  205. return 0;
  206. }
  207. static int qlcnic_83xx_idc_check_major_version(struct qlcnic_adapter *adapter)
  208. {
  209. u32 val;
  210. u8 version;
  211. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  212. version = val & 0xFF;
  213. if (version != QLC_83XX_IDC_MAJOR_VERSION) {
  214. dev_info(&adapter->pdev->dev,
  215. "%s:mismatch. version 0x%x, expected version 0x%x\n",
  216. __func__, version, QLC_83XX_IDC_MAJOR_VERSION);
  217. return -EIO;
  218. }
  219. return 0;
  220. }
  221. static int qlcnic_83xx_idc_clear_registers(struct qlcnic_adapter *adapter,
  222. int lock)
  223. {
  224. u32 val;
  225. if (lock) {
  226. if (qlcnic_83xx_lock_driver(adapter))
  227. return -EBUSY;
  228. }
  229. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, 0);
  230. /* Clear gracefull reset bit */
  231. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  232. val &= ~QLC_83XX_IDC_GRACEFULL_RESET;
  233. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  234. if (lock)
  235. qlcnic_83xx_unlock_driver(adapter);
  236. return 0;
  237. }
  238. static int qlcnic_83xx_idc_update_drv_ack_reg(struct qlcnic_adapter *adapter,
  239. int flag, int lock)
  240. {
  241. u32 val;
  242. if (lock) {
  243. if (qlcnic_83xx_lock_driver(adapter))
  244. return -EBUSY;
  245. }
  246. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  247. if (flag)
  248. val = val | (1 << adapter->portnum);
  249. else
  250. val = val & ~(1 << adapter->portnum);
  251. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, val);
  252. if (lock)
  253. qlcnic_83xx_unlock_driver(adapter);
  254. return 0;
  255. }
  256. static int qlcnic_83xx_idc_check_timeout(struct qlcnic_adapter *adapter,
  257. int time_limit)
  258. {
  259. u64 seconds;
  260. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  261. if (seconds <= time_limit)
  262. return 0;
  263. else
  264. return -EBUSY;
  265. }
  266. /**
  267. * qlcnic_83xx_idc_check_reset_ack_reg
  268. *
  269. * @adapter: adapter structure
  270. *
  271. * Check ACK wait limit and clear the functions which failed to ACK
  272. *
  273. * Return 0 if all functions have acknowledged the reset request.
  274. **/
  275. static int qlcnic_83xx_idc_check_reset_ack_reg(struct qlcnic_adapter *adapter)
  276. {
  277. int timeout;
  278. u32 ack, presence, val;
  279. timeout = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  280. ack = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  281. presence = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  282. dev_info(&adapter->pdev->dev,
  283. "%s: ack = 0x%x, presence = 0x%x\n", __func__, ack, presence);
  284. if (!((ack & presence) == presence)) {
  285. if (qlcnic_83xx_idc_check_timeout(adapter, timeout)) {
  286. /* Clear functions which failed to ACK */
  287. dev_info(&adapter->pdev->dev,
  288. "%s: ACK wait exceeds time limit\n", __func__);
  289. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  290. val = val & ~(ack ^ presence);
  291. if (qlcnic_83xx_lock_driver(adapter))
  292. return -EBUSY;
  293. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  294. dev_info(&adapter->pdev->dev,
  295. "%s: updated drv presence reg = 0x%x\n",
  296. __func__, val);
  297. qlcnic_83xx_unlock_driver(adapter);
  298. return 0;
  299. } else {
  300. return 1;
  301. }
  302. } else {
  303. dev_info(&adapter->pdev->dev,
  304. "%s: Reset ACK received from all functions\n",
  305. __func__);
  306. return 0;
  307. }
  308. }
  309. /**
  310. * qlcnic_83xx_idc_tx_soft_reset
  311. *
  312. * @adapter: adapter structure
  313. *
  314. * Handle context deletion and recreation request from transmit routine
  315. *
  316. * Returns -EBUSY or Success (0)
  317. *
  318. **/
  319. static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter)
  320. {
  321. struct net_device *netdev = adapter->netdev;
  322. if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  323. return -EBUSY;
  324. netif_device_detach(netdev);
  325. qlcnic_down(adapter, netdev);
  326. qlcnic_up(adapter, netdev);
  327. netif_device_attach(netdev);
  328. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  329. netdev_info(adapter->netdev, "%s: soft reset complete.\n", __func__);
  330. return 0;
  331. }
  332. /**
  333. * qlcnic_83xx_idc_detach_driver
  334. *
  335. * @adapter: adapter structure
  336. * Detach net interface, stop TX and cleanup resources before the HW reset.
  337. * Returns: None
  338. *
  339. **/
  340. static void qlcnic_83xx_idc_detach_driver(struct qlcnic_adapter *adapter)
  341. {
  342. int i;
  343. struct net_device *netdev = adapter->netdev;
  344. netif_device_detach(netdev);
  345. qlcnic_83xx_detach_mailbox_work(adapter);
  346. /* Disable mailbox interrupt */
  347. qlcnic_83xx_disable_mbx_intr(adapter);
  348. qlcnic_down(adapter, netdev);
  349. for (i = 0; i < adapter->ahw->num_msix; i++) {
  350. adapter->ahw->intr_tbl[i].id = i;
  351. adapter->ahw->intr_tbl[i].enabled = 0;
  352. adapter->ahw->intr_tbl[i].src = 0;
  353. }
  354. if (qlcnic_sriov_pf_check(adapter))
  355. qlcnic_sriov_pf_reset(adapter);
  356. }
  357. /**
  358. * qlcnic_83xx_idc_attach_driver
  359. *
  360. * @adapter: adapter structure
  361. *
  362. * Re-attach and re-enable net interface
  363. * Returns: None
  364. *
  365. **/
  366. static void qlcnic_83xx_idc_attach_driver(struct qlcnic_adapter *adapter)
  367. {
  368. struct net_device *netdev = adapter->netdev;
  369. if (netif_running(netdev)) {
  370. if (qlcnic_up(adapter, netdev))
  371. goto done;
  372. qlcnic_restore_indev_addr(netdev, NETDEV_UP);
  373. }
  374. done:
  375. netif_device_attach(netdev);
  376. }
  377. static int qlcnic_83xx_idc_enter_failed_state(struct qlcnic_adapter *adapter,
  378. int lock)
  379. {
  380. if (lock) {
  381. if (qlcnic_83xx_lock_driver(adapter))
  382. return -EBUSY;
  383. }
  384. qlcnic_83xx_idc_clear_registers(adapter, 0);
  385. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_FAILED);
  386. if (lock)
  387. qlcnic_83xx_unlock_driver(adapter);
  388. qlcnic_83xx_idc_log_state_history(adapter);
  389. dev_info(&adapter->pdev->dev, "Device will enter failed state\n");
  390. return 0;
  391. }
  392. static int qlcnic_83xx_idc_enter_init_state(struct qlcnic_adapter *adapter,
  393. int lock)
  394. {
  395. if (lock) {
  396. if (qlcnic_83xx_lock_driver(adapter))
  397. return -EBUSY;
  398. }
  399. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_INIT);
  400. if (lock)
  401. qlcnic_83xx_unlock_driver(adapter);
  402. return 0;
  403. }
  404. static int qlcnic_83xx_idc_enter_need_quiesce(struct qlcnic_adapter *adapter,
  405. int lock)
  406. {
  407. if (lock) {
  408. if (qlcnic_83xx_lock_driver(adapter))
  409. return -EBUSY;
  410. }
  411. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  412. QLC_83XX_IDC_DEV_NEED_QUISCENT);
  413. if (lock)
  414. qlcnic_83xx_unlock_driver(adapter);
  415. return 0;
  416. }
  417. static int
  418. qlcnic_83xx_idc_enter_need_reset_state(struct qlcnic_adapter *adapter, int lock)
  419. {
  420. if (lock) {
  421. if (qlcnic_83xx_lock_driver(adapter))
  422. return -EBUSY;
  423. }
  424. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  425. QLC_83XX_IDC_DEV_NEED_RESET);
  426. if (lock)
  427. qlcnic_83xx_unlock_driver(adapter);
  428. return 0;
  429. }
  430. static int qlcnic_83xx_idc_enter_ready_state(struct qlcnic_adapter *adapter,
  431. int lock)
  432. {
  433. if (lock) {
  434. if (qlcnic_83xx_lock_driver(adapter))
  435. return -EBUSY;
  436. }
  437. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_READY);
  438. if (lock)
  439. qlcnic_83xx_unlock_driver(adapter);
  440. return 0;
  441. }
  442. /**
  443. * qlcnic_83xx_idc_find_reset_owner_id
  444. *
  445. * @adapter: adapter structure
  446. *
  447. * NIC gets precedence over ISCSI and ISCSI has precedence over FCOE.
  448. * Within the same class, function with lowest PCI ID assumes ownership
  449. *
  450. * Returns: reset owner id or failure indication (-EIO)
  451. *
  452. **/
  453. static int qlcnic_83xx_idc_find_reset_owner_id(struct qlcnic_adapter *adapter)
  454. {
  455. u32 reg, reg1, reg2, i, j, owner, class;
  456. reg1 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_1);
  457. reg2 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_2);
  458. owner = QLCNIC_TYPE_NIC;
  459. i = 0;
  460. j = 0;
  461. reg = reg1;
  462. do {
  463. class = (((reg & (0xF << j * 4)) >> j * 4) & 0x3);
  464. if (class == owner)
  465. break;
  466. if (i == (QLC_83XX_IDC_MAX_FUNC_PER_PARTITION_INFO - 1)) {
  467. reg = reg2;
  468. j = 0;
  469. } else {
  470. j++;
  471. }
  472. if (i == (QLC_83XX_IDC_MAX_CNA_FUNCTIONS - 1)) {
  473. if (owner == QLCNIC_TYPE_NIC)
  474. owner = QLCNIC_TYPE_ISCSI;
  475. else if (owner == QLCNIC_TYPE_ISCSI)
  476. owner = QLCNIC_TYPE_FCOE;
  477. else if (owner == QLCNIC_TYPE_FCOE)
  478. return -EIO;
  479. reg = reg1;
  480. j = 0;
  481. i = 0;
  482. }
  483. } while (i++ < QLC_83XX_IDC_MAX_CNA_FUNCTIONS);
  484. return i;
  485. }
  486. static int qlcnic_83xx_idc_restart_hw(struct qlcnic_adapter *adapter, int lock)
  487. {
  488. int ret = 0;
  489. ret = qlcnic_83xx_restart_hw(adapter);
  490. if (ret) {
  491. qlcnic_83xx_idc_enter_failed_state(adapter, lock);
  492. } else {
  493. qlcnic_83xx_idc_clear_registers(adapter, lock);
  494. ret = qlcnic_83xx_idc_enter_ready_state(adapter, lock);
  495. }
  496. return ret;
  497. }
  498. static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter)
  499. {
  500. u32 status;
  501. status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
  502. if (status & QLCNIC_RCODE_FATAL_ERROR) {
  503. dev_err(&adapter->pdev->dev,
  504. "peg halt status1=0x%x\n", status);
  505. if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
  506. dev_err(&adapter->pdev->dev,
  507. "On board active cooling fan failed. "
  508. "Device has been halted.\n");
  509. dev_err(&adapter->pdev->dev,
  510. "Replace the adapter.\n");
  511. return -EIO;
  512. }
  513. }
  514. return 0;
  515. }
  516. int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
  517. {
  518. int err;
  519. qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox);
  520. qlcnic_83xx_enable_mbx_interrupt(adapter);
  521. qlcnic_83xx_initialize_nic(adapter, 1);
  522. err = qlcnic_sriov_pf_reinit(adapter);
  523. if (err)
  524. return err;
  525. qlcnic_83xx_enable_mbx_interrupt(adapter);
  526. if (qlcnic_83xx_configure_opmode(adapter)) {
  527. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  528. return -EIO;
  529. }
  530. if (adapter->nic_ops->init_driver(adapter)) {
  531. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  532. return -EIO;
  533. }
  534. if (adapter->portnum == 0)
  535. qlcnic_set_drv_version(adapter);
  536. qlcnic_dcb_get_info(adapter->dcb);
  537. qlcnic_83xx_idc_attach_driver(adapter);
  538. return 0;
  539. }
  540. static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
  541. {
  542. struct qlcnic_hardware_context *ahw = adapter->ahw;
  543. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 1);
  544. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  545. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  546. ahw->idc.quiesce_req = 0;
  547. ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  548. ahw->idc.err_code = 0;
  549. ahw->idc.collect_dump = 0;
  550. ahw->reset_context = 0;
  551. adapter->tx_timeo_cnt = 0;
  552. ahw->idc.delay_reset = 0;
  553. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  554. }
  555. /**
  556. * qlcnic_83xx_idc_ready_state_entry
  557. *
  558. * @adapter: adapter structure
  559. *
  560. * Perform ready state initialization, this routine will get invoked only
  561. * once from READY state.
  562. *
  563. * Returns: Error code or Success(0)
  564. *
  565. **/
  566. int qlcnic_83xx_idc_ready_state_entry(struct qlcnic_adapter *adapter)
  567. {
  568. struct qlcnic_hardware_context *ahw = adapter->ahw;
  569. if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_READY) {
  570. qlcnic_83xx_idc_update_idc_params(adapter);
  571. /* Re-attach the device if required */
  572. if ((ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) ||
  573. (ahw->idc.prev_state == QLC_83XX_IDC_DEV_INIT)) {
  574. if (qlcnic_83xx_idc_reattach_driver(adapter))
  575. return -EIO;
  576. }
  577. }
  578. return 0;
  579. }
  580. /**
  581. * qlcnic_83xx_idc_vnic_pf_entry
  582. *
  583. * @adapter: adapter structure
  584. *
  585. * Ensure vNIC mode privileged function starts only after vNIC mode is
  586. * enabled by management function.
  587. * If vNIC mode is ready, start initialization.
  588. *
  589. * Returns: -EIO or 0
  590. *
  591. **/
  592. int qlcnic_83xx_idc_vnic_pf_entry(struct qlcnic_adapter *adapter)
  593. {
  594. u32 state;
  595. struct qlcnic_hardware_context *ahw = adapter->ahw;
  596. /* Privileged function waits till mgmt function enables VNIC mode */
  597. state = QLCRDX(adapter->ahw, QLC_83XX_VNIC_STATE);
  598. if (state != QLCNIC_DEV_NPAR_OPER) {
  599. if (!ahw->idc.vnic_wait_limit--) {
  600. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  601. return -EIO;
  602. }
  603. dev_info(&adapter->pdev->dev, "vNIC mode disabled\n");
  604. return -EIO;
  605. } else {
  606. /* Perform one time initialization from ready state */
  607. if (ahw->idc.vnic_state != QLCNIC_DEV_NPAR_OPER) {
  608. qlcnic_83xx_idc_update_idc_params(adapter);
  609. /* If the previous state is UNKNOWN, device will be
  610. already attached properly by Init routine*/
  611. if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_UNKNOWN) {
  612. if (qlcnic_83xx_idc_reattach_driver(adapter))
  613. return -EIO;
  614. }
  615. adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_OPER;
  616. dev_info(&adapter->pdev->dev, "vNIC mode enabled\n");
  617. }
  618. }
  619. return 0;
  620. }
  621. static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter)
  622. {
  623. adapter->ahw->idc.err_code = -EIO;
  624. dev_err(&adapter->pdev->dev,
  625. "%s: Device in unknown state\n", __func__);
  626. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  627. return 0;
  628. }
  629. /**
  630. * qlcnic_83xx_idc_cold_state
  631. *
  632. * @adapter: adapter structure
  633. *
  634. * If HW is up and running device will enter READY state.
  635. * If firmware image from host needs to be loaded, device is
  636. * forced to start with the file firmware image.
  637. *
  638. * Returns: Error code or Success(0)
  639. *
  640. **/
  641. static int qlcnic_83xx_idc_cold_state_handler(struct qlcnic_adapter *adapter)
  642. {
  643. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 0);
  644. qlcnic_83xx_idc_update_audit_reg(adapter, 1, 0);
  645. if (qlcnic_load_fw_file) {
  646. qlcnic_83xx_idc_restart_hw(adapter, 0);
  647. } else {
  648. if (qlcnic_83xx_check_hw_status(adapter)) {
  649. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  650. return -EIO;
  651. } else {
  652. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  653. }
  654. }
  655. return 0;
  656. }
  657. /**
  658. * qlcnic_83xx_idc_init_state
  659. *
  660. * @adapter: adapter structure
  661. *
  662. * Reset owner will restart the device from this state.
  663. * Device will enter failed state if it remains
  664. * in this state for more than DEV_INIT time limit.
  665. *
  666. * Returns: Error code or Success(0)
  667. *
  668. **/
  669. static int qlcnic_83xx_idc_init_state(struct qlcnic_adapter *adapter)
  670. {
  671. int timeout, ret = 0;
  672. u32 owner;
  673. timeout = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  674. if (adapter->ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) {
  675. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  676. if (adapter->ahw->pci_func == owner)
  677. ret = qlcnic_83xx_idc_restart_hw(adapter, 1);
  678. } else {
  679. ret = qlcnic_83xx_idc_check_timeout(adapter, timeout);
  680. }
  681. return ret;
  682. }
  683. /**
  684. * qlcnic_83xx_idc_ready_state
  685. *
  686. * @adapter: adapter structure
  687. *
  688. * Perform IDC protocol specicifed actions after monitoring device state and
  689. * events.
  690. *
  691. * Returns: Error code or Success(0)
  692. *
  693. **/
  694. static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter)
  695. {
  696. struct qlcnic_hardware_context *ahw = adapter->ahw;
  697. struct qlcnic_mailbox *mbx = ahw->mailbox;
  698. int ret = 0;
  699. u32 val;
  700. /* Perform NIC configuration based ready state entry actions */
  701. if (ahw->idc.state_entry(adapter))
  702. return -EIO;
  703. if (qlcnic_check_temp(adapter)) {
  704. if (ahw->temp == QLCNIC_TEMP_PANIC) {
  705. qlcnic_83xx_idc_check_fan_failure(adapter);
  706. dev_err(&adapter->pdev->dev,
  707. "Error: device temperature %d above limits\n",
  708. adapter->ahw->temp);
  709. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  710. set_bit(__QLCNIC_RESETTING, &adapter->state);
  711. qlcnic_83xx_idc_detach_driver(adapter);
  712. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  713. return -EIO;
  714. }
  715. }
  716. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  717. ret = qlcnic_83xx_check_heartbeat(adapter);
  718. if (ret) {
  719. adapter->flags |= QLCNIC_FW_HANG;
  720. if (!(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  721. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  722. set_bit(__QLCNIC_RESETTING, &adapter->state);
  723. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  724. } else {
  725. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  726. __func__);
  727. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  728. }
  729. return -EIO;
  730. }
  731. if ((val & QLC_83XX_IDC_GRACEFULL_RESET) || ahw->idc.collect_dump) {
  732. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  733. /* Move to need reset state and prepare for reset */
  734. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  735. return ret;
  736. }
  737. /* Check for soft reset request */
  738. if (ahw->reset_context &&
  739. !(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  740. adapter->ahw->reset_context = 0;
  741. qlcnic_83xx_idc_tx_soft_reset(adapter);
  742. return ret;
  743. }
  744. /* Move to need quiesce state if requested */
  745. if (adapter->ahw->idc.quiesce_req) {
  746. qlcnic_83xx_idc_enter_need_quiesce(adapter, 1);
  747. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  748. return ret;
  749. }
  750. return ret;
  751. }
  752. /**
  753. * qlcnic_83xx_idc_need_reset_state
  754. *
  755. * @adapter: adapter structure
  756. *
  757. * Device will remain in this state until:
  758. * Reset request ACK's are recieved from all the functions
  759. * Wait time exceeds max time limit
  760. *
  761. * Returns: Error code or Success(0)
  762. *
  763. **/
  764. static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
  765. {
  766. struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
  767. int ret = 0;
  768. if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
  769. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  770. set_bit(__QLCNIC_RESETTING, &adapter->state);
  771. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  772. if (adapter->ahw->nic_mode == QLCNIC_VNIC_MODE)
  773. qlcnic_83xx_disable_vnic_mode(adapter, 1);
  774. if (qlcnic_check_diag_status(adapter)) {
  775. dev_info(&adapter->pdev->dev,
  776. "%s: Wait for diag completion\n", __func__);
  777. adapter->ahw->idc.delay_reset = 1;
  778. return 0;
  779. } else {
  780. qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
  781. qlcnic_83xx_idc_detach_driver(adapter);
  782. }
  783. }
  784. if (qlcnic_check_diag_status(adapter)) {
  785. dev_info(&adapter->pdev->dev,
  786. "%s: Wait for diag completion\n", __func__);
  787. return -1;
  788. } else {
  789. if (adapter->ahw->idc.delay_reset) {
  790. qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
  791. qlcnic_83xx_idc_detach_driver(adapter);
  792. adapter->ahw->idc.delay_reset = 0;
  793. }
  794. /* Check for ACK from other functions */
  795. ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
  796. if (ret) {
  797. dev_info(&adapter->pdev->dev,
  798. "%s: Waiting for reset ACK\n", __func__);
  799. return -1;
  800. }
  801. }
  802. /* Transit to INIT state and restart the HW */
  803. qlcnic_83xx_idc_enter_init_state(adapter, 1);
  804. return ret;
  805. }
  806. static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter)
  807. {
  808. dev_err(&adapter->pdev->dev, "%s: TBD\n", __func__);
  809. return 0;
  810. }
  811. static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter)
  812. {
  813. struct qlcnic_hardware_context *ahw = adapter->ahw;
  814. u32 val, owner;
  815. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  816. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  817. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  818. if (ahw->pci_func == owner) {
  819. qlcnic_83xx_stop_hw(adapter);
  820. qlcnic_dump_fw(adapter);
  821. }
  822. }
  823. netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n",
  824. __func__);
  825. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  826. ahw->idc.err_code = -EIO;
  827. return;
  828. }
  829. static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter)
  830. {
  831. dev_info(&adapter->pdev->dev, "%s: TBD\n", __func__);
  832. return 0;
  833. }
  834. static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
  835. u32 state)
  836. {
  837. u32 cur, prev, next;
  838. cur = adapter->ahw->idc.curr_state;
  839. prev = adapter->ahw->idc.prev_state;
  840. next = state;
  841. if ((next < QLC_83XX_IDC_DEV_COLD) ||
  842. (next > QLC_83XX_IDC_DEV_QUISCENT)) {
  843. dev_err(&adapter->pdev->dev,
  844. "%s: curr %d, prev %d, next state %d is invalid\n",
  845. __func__, cur, prev, state);
  846. return 1;
  847. }
  848. if ((cur == QLC_83XX_IDC_DEV_UNKNOWN) &&
  849. (prev == QLC_83XX_IDC_DEV_UNKNOWN)) {
  850. if ((next != QLC_83XX_IDC_DEV_COLD) &&
  851. (next != QLC_83XX_IDC_DEV_READY)) {
  852. dev_err(&adapter->pdev->dev,
  853. "%s: failed, cur %d prev %d next %d\n",
  854. __func__, cur, prev, next);
  855. return 1;
  856. }
  857. }
  858. if (next == QLC_83XX_IDC_DEV_INIT) {
  859. if ((prev != QLC_83XX_IDC_DEV_INIT) &&
  860. (prev != QLC_83XX_IDC_DEV_COLD) &&
  861. (prev != QLC_83XX_IDC_DEV_NEED_RESET)) {
  862. dev_err(&adapter->pdev->dev,
  863. "%s: failed, cur %d prev %d next %d\n",
  864. __func__, cur, prev, next);
  865. return 1;
  866. }
  867. }
  868. return 0;
  869. }
  870. #ifdef CONFIG_QLCNIC_VXLAN
  871. #define QLC_83XX_ENCAP_TYPE_VXLAN BIT_1
  872. #define QLC_83XX_MATCH_ENCAP_ID BIT_2
  873. #define QLC_83XX_SET_VXLAN_UDP_DPORT BIT_3
  874. #define QLC_83XX_VXLAN_UDP_DPORT(PORT) ((PORT & 0xffff) << 16)
  875. #define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
  876. #define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0
  877. static int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter)
  878. {
  879. u16 port = adapter->ahw->vxlan_port;
  880. struct qlcnic_cmd_args cmd;
  881. int ret = 0;
  882. memset(&cmd, 0, sizeof(cmd));
  883. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  884. QLCNIC_CMD_INIT_NIC_FUNC);
  885. if (ret)
  886. return ret;
  887. cmd.req.arg[1] = QLC_83XX_MULTI_TENANCY_INFO;
  888. cmd.req.arg[2] = QLC_83XX_ENCAP_TYPE_VXLAN |
  889. QLC_83XX_SET_VXLAN_UDP_DPORT |
  890. QLC_83XX_VXLAN_UDP_DPORT(port);
  891. ret = qlcnic_issue_cmd(adapter, &cmd);
  892. if (ret)
  893. netdev_err(adapter->netdev,
  894. "Failed to set VXLAN port %d in adapter\n",
  895. port);
  896. qlcnic_free_mbx_args(&cmd);
  897. return ret;
  898. }
  899. static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter,
  900. bool state)
  901. {
  902. u16 vxlan_port = adapter->ahw->vxlan_port;
  903. struct qlcnic_cmd_args cmd;
  904. int ret = 0;
  905. memset(&cmd, 0, sizeof(cmd));
  906. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  907. QLCNIC_CMD_SET_INGRESS_ENCAP);
  908. if (ret)
  909. return ret;
  910. cmd.req.arg[1] = state ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
  911. QLCNIC_DISABLE_INGRESS_ENCAP_PARSING;
  912. ret = qlcnic_issue_cmd(adapter, &cmd);
  913. if (ret)
  914. netdev_err(adapter->netdev,
  915. "Failed to %s VXLAN parsing for port %d\n",
  916. state ? "enable" : "disable", vxlan_port);
  917. else
  918. netdev_info(adapter->netdev,
  919. "%s VXLAN parsing for port %d\n",
  920. state ? "Enabled" : "Disabled", vxlan_port);
  921. qlcnic_free_mbx_args(&cmd);
  922. return ret;
  923. }
  924. #endif
  925. static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
  926. {
  927. if (adapter->fhash.fnum)
  928. qlcnic_prune_lb_filters(adapter);
  929. #ifdef CONFIG_QLCNIC_VXLAN
  930. if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) {
  931. if (qlcnic_set_vxlan_port(adapter))
  932. return;
  933. if (qlcnic_set_vxlan_parsing(adapter, true))
  934. return;
  935. adapter->flags &= ~QLCNIC_ADD_VXLAN_PORT;
  936. } else if (adapter->flags & QLCNIC_DEL_VXLAN_PORT) {
  937. if (qlcnic_set_vxlan_parsing(adapter, false))
  938. return;
  939. adapter->ahw->vxlan_port = 0;
  940. adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT;
  941. }
  942. #endif
  943. }
  944. /**
  945. * qlcnic_83xx_idc_poll_dev_state
  946. *
  947. * @work: kernel work queue structure used to schedule the function
  948. *
  949. * Poll device state periodically and perform state specific
  950. * actions defined by Inter Driver Communication (IDC) protocol.
  951. *
  952. * Returns: None
  953. *
  954. **/
  955. void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work)
  956. {
  957. struct qlcnic_adapter *adapter;
  958. u32 state;
  959. adapter = container_of(work, struct qlcnic_adapter, fw_work.work);
  960. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  961. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  962. qlcnic_83xx_idc_log_state_history(adapter);
  963. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  964. } else {
  965. adapter->ahw->idc.curr_state = state;
  966. }
  967. switch (adapter->ahw->idc.curr_state) {
  968. case QLC_83XX_IDC_DEV_READY:
  969. qlcnic_83xx_idc_ready_state(adapter);
  970. break;
  971. case QLC_83XX_IDC_DEV_NEED_RESET:
  972. qlcnic_83xx_idc_need_reset_state(adapter);
  973. break;
  974. case QLC_83XX_IDC_DEV_NEED_QUISCENT:
  975. qlcnic_83xx_idc_need_quiesce_state(adapter);
  976. break;
  977. case QLC_83XX_IDC_DEV_FAILED:
  978. qlcnic_83xx_idc_failed_state(adapter);
  979. return;
  980. case QLC_83XX_IDC_DEV_INIT:
  981. qlcnic_83xx_idc_init_state(adapter);
  982. break;
  983. case QLC_83XX_IDC_DEV_QUISCENT:
  984. qlcnic_83xx_idc_quiesce_state(adapter);
  985. break;
  986. default:
  987. qlcnic_83xx_idc_unknown_state(adapter);
  988. return;
  989. }
  990. adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state;
  991. qlcnic_83xx_periodic_tasks(adapter);
  992. /* Re-schedule the function */
  993. if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status))
  994. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
  995. adapter->ahw->idc.delay);
  996. }
  997. static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter)
  998. {
  999. u32 idc_params, val;
  1000. if (qlcnic_83xx_lockless_flash_read32(adapter,
  1001. QLC_83XX_IDC_FLASH_PARAM_ADDR,
  1002. (u8 *)&idc_params, 1)) {
  1003. dev_info(&adapter->pdev->dev,
  1004. "%s:failed to get IDC params from flash\n", __func__);
  1005. adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  1006. adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  1007. } else {
  1008. adapter->dev_init_timeo = idc_params & 0xFFFF;
  1009. adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF);
  1010. }
  1011. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1012. adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1013. adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  1014. adapter->ahw->idc.err_code = 0;
  1015. adapter->ahw->idc.collect_dump = 0;
  1016. adapter->ahw->idc.name = (char **)qlc_83xx_idc_states;
  1017. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1018. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1019. /* Check if reset recovery is disabled */
  1020. if (!qlcnic_auto_fw_reset) {
  1021. /* Propagate do not reset request to other functions */
  1022. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1023. val = val | QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1024. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1025. }
  1026. }
  1027. static int
  1028. qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
  1029. {
  1030. u32 state, val;
  1031. if (qlcnic_83xx_lock_driver(adapter))
  1032. return -EIO;
  1033. /* Clear driver lock register */
  1034. QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0);
  1035. if (qlcnic_83xx_idc_update_major_version(adapter, 0)) {
  1036. qlcnic_83xx_unlock_driver(adapter);
  1037. return -EIO;
  1038. }
  1039. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  1040. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  1041. qlcnic_83xx_unlock_driver(adapter);
  1042. return -EIO;
  1043. }
  1044. if (state != QLC_83XX_IDC_DEV_COLD && qlcnic_load_fw_file) {
  1045. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  1046. QLC_83XX_IDC_DEV_COLD);
  1047. state = QLC_83XX_IDC_DEV_COLD;
  1048. }
  1049. adapter->ahw->idc.curr_state = state;
  1050. /* First to load function should cold boot the device */
  1051. if (state == QLC_83XX_IDC_DEV_COLD)
  1052. qlcnic_83xx_idc_cold_state_handler(adapter);
  1053. /* Check if reset recovery is enabled */
  1054. if (qlcnic_auto_fw_reset) {
  1055. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1056. val = val & ~QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1057. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1058. }
  1059. qlcnic_83xx_unlock_driver(adapter);
  1060. return 0;
  1061. }
  1062. int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
  1063. {
  1064. int ret = -EIO;
  1065. qlcnic_83xx_setup_idc_parameters(adapter);
  1066. if (qlcnic_83xx_get_reset_instruction_template(adapter))
  1067. return ret;
  1068. if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) {
  1069. if (qlcnic_83xx_idc_first_to_load_function_handler(adapter))
  1070. return -EIO;
  1071. } else {
  1072. if (qlcnic_83xx_idc_check_major_version(adapter))
  1073. return -EIO;
  1074. }
  1075. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  1076. return 0;
  1077. }
  1078. void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter)
  1079. {
  1080. int id;
  1081. u32 val;
  1082. while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  1083. usleep_range(10000, 11000);
  1084. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1085. id = id & 0xFF;
  1086. if (id == adapter->portnum) {
  1087. dev_err(&adapter->pdev->dev,
  1088. "%s: wait for lock recovery.. %d\n", __func__, id);
  1089. msleep(20);
  1090. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1091. id = id & 0xFF;
  1092. }
  1093. /* Clear driver presence bit */
  1094. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  1095. val = val & ~(1 << adapter->portnum);
  1096. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  1097. clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1098. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1099. cancel_delayed_work_sync(&adapter->fw_work);
  1100. }
  1101. void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key)
  1102. {
  1103. u32 val;
  1104. if (qlcnic_sriov_vf_check(adapter))
  1105. return;
  1106. if (qlcnic_83xx_lock_driver(adapter)) {
  1107. dev_err(&adapter->pdev->dev,
  1108. "%s:failed, please retry\n", __func__);
  1109. return;
  1110. }
  1111. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1112. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1113. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1114. __func__);
  1115. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  1116. qlcnic_83xx_unlock_driver(adapter);
  1117. return;
  1118. }
  1119. if (key == QLCNIC_FORCE_FW_RESET) {
  1120. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1121. val = val | QLC_83XX_IDC_GRACEFULL_RESET;
  1122. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1123. } else if (key == QLCNIC_FORCE_FW_DUMP_KEY) {
  1124. adapter->ahw->idc.collect_dump = 1;
  1125. }
  1126. qlcnic_83xx_unlock_driver(adapter);
  1127. return;
  1128. }
  1129. static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
  1130. {
  1131. u8 *p_cache;
  1132. u32 src, size;
  1133. u64 dest;
  1134. int ret = -EIO;
  1135. src = QLC_83XX_BOOTLOADER_FLASH_ADDR;
  1136. dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR);
  1137. size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE);
  1138. /* alignment check */
  1139. if (size & 0xF)
  1140. size = (size + 16) & ~0xF;
  1141. p_cache = vzalloc(size);
  1142. if (p_cache == NULL)
  1143. return -ENOMEM;
  1144. ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache,
  1145. size / sizeof(u32));
  1146. if (ret) {
  1147. vfree(p_cache);
  1148. return ret;
  1149. }
  1150. /* 16 byte write to MS memory */
  1151. ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache,
  1152. size / 16);
  1153. if (ret) {
  1154. vfree(p_cache);
  1155. return ret;
  1156. }
  1157. vfree(p_cache);
  1158. return ret;
  1159. }
  1160. static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
  1161. {
  1162. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1163. const struct firmware *fw = fw_info->fw;
  1164. u32 dest, *p_cache;
  1165. int i, ret = -EIO;
  1166. u8 data[16];
  1167. size_t size;
  1168. u64 addr;
  1169. dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
  1170. size = (fw->size & ~0xF);
  1171. p_cache = (u32 *)fw->data;
  1172. addr = (u64)dest;
  1173. ret = qlcnic_ms_mem_write128(adapter, addr,
  1174. p_cache, size / 16);
  1175. if (ret) {
  1176. dev_err(&adapter->pdev->dev, "MS memory write failed\n");
  1177. release_firmware(fw);
  1178. fw_info->fw = NULL;
  1179. return -EIO;
  1180. }
  1181. /* alignment check */
  1182. if (fw->size & 0xF) {
  1183. addr = dest + size;
  1184. for (i = 0; i < (fw->size & 0xF); i++)
  1185. data[i] = fw->data[size + i];
  1186. for (; i < 16; i++)
  1187. data[i] = 0;
  1188. ret = qlcnic_ms_mem_write128(adapter, addr,
  1189. (u32 *)data, 1);
  1190. if (ret) {
  1191. dev_err(&adapter->pdev->dev,
  1192. "MS memory write failed\n");
  1193. release_firmware(fw);
  1194. fw_info->fw = NULL;
  1195. return -EIO;
  1196. }
  1197. }
  1198. release_firmware(fw);
  1199. fw_info->fw = NULL;
  1200. return 0;
  1201. }
  1202. static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
  1203. {
  1204. int i, j;
  1205. u32 val = 0, val1 = 0, reg = 0;
  1206. int err = 0;
  1207. val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
  1208. if (err == -EIO)
  1209. return;
  1210. dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
  1211. for (j = 0; j < 2; j++) {
  1212. if (j == 0) {
  1213. dev_info(&adapter->pdev->dev,
  1214. "Port 0 RxB Pause Threshold Regs[TC7..TC0]:");
  1215. reg = QLC_83XX_PORT0_THRESHOLD;
  1216. } else if (j == 1) {
  1217. dev_info(&adapter->pdev->dev,
  1218. "Port 1 RxB Pause Threshold Regs[TC7..TC0]:");
  1219. reg = QLC_83XX_PORT1_THRESHOLD;
  1220. }
  1221. for (i = 0; i < 8; i++) {
  1222. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1223. if (err == -EIO)
  1224. return;
  1225. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1226. }
  1227. dev_info(&adapter->pdev->dev, "\n");
  1228. }
  1229. for (j = 0; j < 2; j++) {
  1230. if (j == 0) {
  1231. dev_info(&adapter->pdev->dev,
  1232. "Port 0 RxB TC Max Cell Registers[4..1]:");
  1233. reg = QLC_83XX_PORT0_TC_MC_REG;
  1234. } else if (j == 1) {
  1235. dev_info(&adapter->pdev->dev,
  1236. "Port 1 RxB TC Max Cell Registers[4..1]:");
  1237. reg = QLC_83XX_PORT1_TC_MC_REG;
  1238. }
  1239. for (i = 0; i < 4; i++) {
  1240. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1241. if (err == -EIO)
  1242. return;
  1243. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1244. }
  1245. dev_info(&adapter->pdev->dev, "\n");
  1246. }
  1247. for (j = 0; j < 2; j++) {
  1248. if (j == 0) {
  1249. dev_info(&adapter->pdev->dev,
  1250. "Port 0 RxB Rx TC Stats[TC7..TC0]:");
  1251. reg = QLC_83XX_PORT0_TC_STATS;
  1252. } else if (j == 1) {
  1253. dev_info(&adapter->pdev->dev,
  1254. "Port 1 RxB Rx TC Stats[TC7..TC0]:");
  1255. reg = QLC_83XX_PORT1_TC_STATS;
  1256. }
  1257. for (i = 7; i >= 0; i--) {
  1258. val = QLCRD32(adapter, reg, &err);
  1259. if (err == -EIO)
  1260. return;
  1261. val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
  1262. QLCWR32(adapter, reg, (val | (i << 29)));
  1263. val = QLCRD32(adapter, reg, &err);
  1264. if (err == -EIO)
  1265. return;
  1266. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1267. }
  1268. dev_info(&adapter->pdev->dev, "\n");
  1269. }
  1270. val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
  1271. if (err == -EIO)
  1272. return;
  1273. val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
  1274. if (err == -EIO)
  1275. return;
  1276. dev_info(&adapter->pdev->dev,
  1277. "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
  1278. val, val1);
  1279. }
  1280. static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
  1281. {
  1282. u32 reg = 0, i, j;
  1283. if (qlcnic_83xx_lock_driver(adapter)) {
  1284. dev_err(&adapter->pdev->dev,
  1285. "%s:failed to acquire driver lock\n", __func__);
  1286. return;
  1287. }
  1288. qlcnic_83xx_dump_pause_control_regs(adapter);
  1289. QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0);
  1290. for (j = 0; j < 2; j++) {
  1291. if (j == 0)
  1292. reg = QLC_83XX_PORT0_THRESHOLD;
  1293. else if (j == 1)
  1294. reg = QLC_83XX_PORT1_THRESHOLD;
  1295. for (i = 0; i < 8; i++)
  1296. QLCWR32(adapter, reg + (i * 0x4), 0x0);
  1297. }
  1298. for (j = 0; j < 2; j++) {
  1299. if (j == 0)
  1300. reg = QLC_83XX_PORT0_TC_MC_REG;
  1301. else if (j == 1)
  1302. reg = QLC_83XX_PORT1_TC_MC_REG;
  1303. for (i = 0; i < 4; i++)
  1304. QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF);
  1305. }
  1306. QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0);
  1307. QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0);
  1308. dev_info(&adapter->pdev->dev,
  1309. "Disabled pause frames successfully on all ports\n");
  1310. qlcnic_83xx_unlock_driver(adapter);
  1311. }
  1312. static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
  1313. {
  1314. QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
  1315. QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
  1316. QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
  1317. QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
  1318. QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
  1319. QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
  1320. QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
  1321. QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
  1322. QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
  1323. }
  1324. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
  1325. {
  1326. u32 heartbeat, peg_status;
  1327. int retries, ret = -EIO, err = 0;
  1328. retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
  1329. p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1330. QLCNIC_PEG_ALIVE_COUNTER);
  1331. do {
  1332. msleep(QLCNIC_HEARTBEAT_PERIOD_MSECS);
  1333. heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1334. QLCNIC_PEG_ALIVE_COUNTER);
  1335. if (heartbeat != p_dev->heartbeat) {
  1336. ret = QLCNIC_RCODE_SUCCESS;
  1337. break;
  1338. }
  1339. } while (--retries);
  1340. if (ret) {
  1341. dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
  1342. qlcnic_83xx_take_eport_out_of_reset(p_dev);
  1343. qlcnic_83xx_disable_pause_frames(p_dev);
  1344. peg_status = QLC_SHARED_REG_RD32(p_dev,
  1345. QLCNIC_PEG_HALT_STATUS1);
  1346. dev_info(&p_dev->pdev->dev, "Dumping HW/FW registers\n"
  1347. "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
  1348. "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
  1349. "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
  1350. "PEG_NET_4_PC: 0x%x\n", peg_status,
  1351. QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
  1352. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
  1353. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
  1354. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
  1355. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
  1356. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
  1357. if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
  1358. dev_err(&p_dev->pdev->dev,
  1359. "Device is being reset err code 0x00006700.\n");
  1360. }
  1361. return ret;
  1362. }
  1363. static int qlcnic_83xx_check_cmd_peg_status(struct qlcnic_adapter *p_dev)
  1364. {
  1365. int retries = QLCNIC_CMDPEG_CHECK_RETRY_COUNT;
  1366. u32 val;
  1367. do {
  1368. val = QLC_SHARED_REG_RD32(p_dev, QLCNIC_CMDPEG_STATE);
  1369. if (val == QLC_83XX_CMDPEG_COMPLETE)
  1370. return 0;
  1371. msleep(QLCNIC_CMDPEG_CHECK_DELAY);
  1372. } while (--retries);
  1373. dev_err(&p_dev->pdev->dev, "%s: failed, state = 0x%x\n", __func__, val);
  1374. return -EIO;
  1375. }
  1376. static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
  1377. {
  1378. int err;
  1379. err = qlcnic_83xx_check_cmd_peg_status(p_dev);
  1380. if (err)
  1381. return err;
  1382. err = qlcnic_83xx_check_heartbeat(p_dev);
  1383. if (err)
  1384. return err;
  1385. return err;
  1386. }
  1387. static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
  1388. int duration, u32 mask, u32 status)
  1389. {
  1390. int timeout_error, err = 0;
  1391. u32 value;
  1392. u8 retries;
  1393. value = QLCRD32(p_dev, addr, &err);
  1394. if (err == -EIO)
  1395. return err;
  1396. retries = duration / 10;
  1397. do {
  1398. if ((value & mask) != status) {
  1399. timeout_error = 1;
  1400. msleep(duration / 10);
  1401. value = QLCRD32(p_dev, addr, &err);
  1402. if (err == -EIO)
  1403. return err;
  1404. } else {
  1405. timeout_error = 0;
  1406. break;
  1407. }
  1408. } while (retries--);
  1409. if (timeout_error) {
  1410. p_dev->ahw->reset.seq_error++;
  1411. dev_err(&p_dev->pdev->dev,
  1412. "%s: Timeout Err, entry_num = %d\n",
  1413. __func__, p_dev->ahw->reset.seq_index);
  1414. dev_err(&p_dev->pdev->dev,
  1415. "0x%08x 0x%08x 0x%08x\n",
  1416. value, mask, status);
  1417. }
  1418. return timeout_error;
  1419. }
  1420. static int qlcnic_83xx_reset_template_checksum(struct qlcnic_adapter *p_dev)
  1421. {
  1422. u32 sum = 0;
  1423. u16 *buff = (u16 *)p_dev->ahw->reset.buff;
  1424. int count = p_dev->ahw->reset.hdr->size / sizeof(u16);
  1425. while (count-- > 0)
  1426. sum += *buff++;
  1427. while (sum >> 16)
  1428. sum = (sum & 0xFFFF) + (sum >> 16);
  1429. if (~sum) {
  1430. return 0;
  1431. } else {
  1432. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1433. return -1;
  1434. }
  1435. }
  1436. static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
  1437. {
  1438. struct qlcnic_hardware_context *ahw = p_dev->ahw;
  1439. u32 addr, count, prev_ver, curr_ver;
  1440. u8 *p_buff;
  1441. if (ahw->reset.buff != NULL) {
  1442. prev_ver = p_dev->fw_version;
  1443. curr_ver = qlcnic_83xx_get_fw_version(p_dev);
  1444. if (curr_ver > prev_ver)
  1445. kfree(ahw->reset.buff);
  1446. else
  1447. return 0;
  1448. }
  1449. ahw->reset.seq_error = 0;
  1450. ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL);
  1451. if (p_dev->ahw->reset.buff == NULL)
  1452. return -ENOMEM;
  1453. p_buff = p_dev->ahw->reset.buff;
  1454. addr = QLC_83XX_RESET_TEMPLATE_ADDR;
  1455. count = sizeof(struct qlc_83xx_reset_hdr) / sizeof(u32);
  1456. /* Copy template header from flash */
  1457. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1458. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1459. return -EIO;
  1460. }
  1461. ahw->reset.hdr = (struct qlc_83xx_reset_hdr *)ahw->reset.buff;
  1462. addr = QLC_83XX_RESET_TEMPLATE_ADDR + ahw->reset.hdr->hdr_size;
  1463. p_buff = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1464. count = (ahw->reset.hdr->size - ahw->reset.hdr->hdr_size) / sizeof(u32);
  1465. /* Copy rest of the template */
  1466. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1467. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1468. return -EIO;
  1469. }
  1470. if (qlcnic_83xx_reset_template_checksum(p_dev))
  1471. return -EIO;
  1472. /* Get Stop, Start and Init command offsets */
  1473. ahw->reset.init_offset = ahw->reset.buff + ahw->reset.hdr->init_offset;
  1474. ahw->reset.start_offset = ahw->reset.buff +
  1475. ahw->reset.hdr->start_offset;
  1476. ahw->reset.stop_offset = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1477. return 0;
  1478. }
  1479. /* Read Write HW register command */
  1480. static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
  1481. u32 raddr, u32 waddr)
  1482. {
  1483. int err = 0;
  1484. u32 value;
  1485. value = QLCRD32(p_dev, raddr, &err);
  1486. if (err == -EIO)
  1487. return;
  1488. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1489. }
  1490. /* Read Modify Write HW register command */
  1491. static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
  1492. u32 raddr, u32 waddr,
  1493. struct qlc_83xx_rmw *p_rmw_hdr)
  1494. {
  1495. int err = 0;
  1496. u32 value;
  1497. if (p_rmw_hdr->index_a) {
  1498. value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
  1499. } else {
  1500. value = QLCRD32(p_dev, raddr, &err);
  1501. if (err == -EIO)
  1502. return;
  1503. }
  1504. value &= p_rmw_hdr->mask;
  1505. value <<= p_rmw_hdr->shl;
  1506. value >>= p_rmw_hdr->shr;
  1507. value |= p_rmw_hdr->or_value;
  1508. value ^= p_rmw_hdr->xor_value;
  1509. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1510. }
  1511. /* Write HW register command */
  1512. static void qlcnic_83xx_write_list(struct qlcnic_adapter *p_dev,
  1513. struct qlc_83xx_entry_hdr *p_hdr)
  1514. {
  1515. int i;
  1516. struct qlc_83xx_entry *entry;
  1517. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1518. sizeof(struct qlc_83xx_entry_hdr));
  1519. for (i = 0; i < p_hdr->count; i++, entry++) {
  1520. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->arg1,
  1521. entry->arg2);
  1522. if (p_hdr->delay)
  1523. udelay((u32)(p_hdr->delay));
  1524. }
  1525. }
  1526. /* Read and Write instruction */
  1527. static void qlcnic_83xx_read_write_list(struct qlcnic_adapter *p_dev,
  1528. struct qlc_83xx_entry_hdr *p_hdr)
  1529. {
  1530. int i;
  1531. struct qlc_83xx_entry *entry;
  1532. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1533. sizeof(struct qlc_83xx_entry_hdr));
  1534. for (i = 0; i < p_hdr->count; i++, entry++) {
  1535. qlcnic_83xx_read_write_crb_reg(p_dev, entry->arg1,
  1536. entry->arg2);
  1537. if (p_hdr->delay)
  1538. udelay((u32)(p_hdr->delay));
  1539. }
  1540. }
  1541. /* Poll HW register command */
  1542. static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
  1543. struct qlc_83xx_entry_hdr *p_hdr)
  1544. {
  1545. long delay;
  1546. struct qlc_83xx_entry *entry;
  1547. struct qlc_83xx_poll *poll;
  1548. int i, err = 0;
  1549. unsigned long arg1, arg2;
  1550. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1551. sizeof(struct qlc_83xx_entry_hdr));
  1552. entry = (struct qlc_83xx_entry *)((char *)poll +
  1553. sizeof(struct qlc_83xx_poll));
  1554. delay = (long)p_hdr->delay;
  1555. if (!delay) {
  1556. for (i = 0; i < p_hdr->count; i++, entry++)
  1557. qlcnic_83xx_poll_reg(p_dev, entry->arg1,
  1558. delay, poll->mask,
  1559. poll->status);
  1560. } else {
  1561. for (i = 0; i < p_hdr->count; i++, entry++) {
  1562. arg1 = entry->arg1;
  1563. arg2 = entry->arg2;
  1564. if (delay) {
  1565. if (qlcnic_83xx_poll_reg(p_dev,
  1566. arg1, delay,
  1567. poll->mask,
  1568. poll->status)){
  1569. QLCRD32(p_dev, arg1, &err);
  1570. if (err == -EIO)
  1571. return;
  1572. QLCRD32(p_dev, arg2, &err);
  1573. if (err == -EIO)
  1574. return;
  1575. }
  1576. }
  1577. }
  1578. }
  1579. }
  1580. /* Poll and write HW register command */
  1581. static void qlcnic_83xx_poll_write_list(struct qlcnic_adapter *p_dev,
  1582. struct qlc_83xx_entry_hdr *p_hdr)
  1583. {
  1584. int i;
  1585. long delay;
  1586. struct qlc_83xx_quad_entry *entry;
  1587. struct qlc_83xx_poll *poll;
  1588. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1589. sizeof(struct qlc_83xx_entry_hdr));
  1590. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1591. sizeof(struct qlc_83xx_poll));
  1592. delay = (long)p_hdr->delay;
  1593. for (i = 0; i < p_hdr->count; i++, entry++) {
  1594. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->dr_addr,
  1595. entry->dr_value);
  1596. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1597. entry->ar_value);
  1598. if (delay)
  1599. qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1600. poll->mask, poll->status);
  1601. }
  1602. }
  1603. /* Read Modify Write register command */
  1604. static void qlcnic_83xx_read_modify_write(struct qlcnic_adapter *p_dev,
  1605. struct qlc_83xx_entry_hdr *p_hdr)
  1606. {
  1607. int i;
  1608. struct qlc_83xx_entry *entry;
  1609. struct qlc_83xx_rmw *rmw_hdr;
  1610. rmw_hdr = (struct qlc_83xx_rmw *)((char *)p_hdr +
  1611. sizeof(struct qlc_83xx_entry_hdr));
  1612. entry = (struct qlc_83xx_entry *)((char *)rmw_hdr +
  1613. sizeof(struct qlc_83xx_rmw));
  1614. for (i = 0; i < p_hdr->count; i++, entry++) {
  1615. qlcnic_83xx_rmw_crb_reg(p_dev, entry->arg1,
  1616. entry->arg2, rmw_hdr);
  1617. if (p_hdr->delay)
  1618. udelay((u32)(p_hdr->delay));
  1619. }
  1620. }
  1621. static void qlcnic_83xx_pause(struct qlc_83xx_entry_hdr *p_hdr)
  1622. {
  1623. if (p_hdr->delay)
  1624. mdelay((u32)((long)p_hdr->delay));
  1625. }
  1626. /* Read and poll register command */
  1627. static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
  1628. struct qlc_83xx_entry_hdr *p_hdr)
  1629. {
  1630. long delay;
  1631. int index, i, j, err;
  1632. struct qlc_83xx_quad_entry *entry;
  1633. struct qlc_83xx_poll *poll;
  1634. unsigned long addr;
  1635. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1636. sizeof(struct qlc_83xx_entry_hdr));
  1637. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1638. sizeof(struct qlc_83xx_poll));
  1639. delay = (long)p_hdr->delay;
  1640. for (i = 0; i < p_hdr->count; i++, entry++) {
  1641. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1642. entry->ar_value);
  1643. if (delay) {
  1644. if (!qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1645. poll->mask, poll->status)){
  1646. index = p_dev->ahw->reset.array_index;
  1647. addr = entry->dr_addr;
  1648. j = QLCRD32(p_dev, addr, &err);
  1649. if (err == -EIO)
  1650. return;
  1651. p_dev->ahw->reset.array[index++] = j;
  1652. if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
  1653. p_dev->ahw->reset.array_index = 1;
  1654. }
  1655. }
  1656. }
  1657. }
  1658. static inline void qlcnic_83xx_seq_end(struct qlcnic_adapter *p_dev)
  1659. {
  1660. p_dev->ahw->reset.seq_end = 1;
  1661. }
  1662. static void qlcnic_83xx_template_end(struct qlcnic_adapter *p_dev)
  1663. {
  1664. p_dev->ahw->reset.template_end = 1;
  1665. if (p_dev->ahw->reset.seq_error == 0)
  1666. dev_err(&p_dev->pdev->dev,
  1667. "HW restart process completed successfully.\n");
  1668. else
  1669. dev_err(&p_dev->pdev->dev,
  1670. "HW restart completed with timeout errors.\n");
  1671. }
  1672. /**
  1673. * qlcnic_83xx_exec_template_cmd
  1674. *
  1675. * @p_dev: adapter structure
  1676. * @p_buff: Poiter to instruction template
  1677. *
  1678. * Template provides instructions to stop, restart and initalize firmware.
  1679. * These instructions are abstracted as a series of read, write and
  1680. * poll operations on hardware registers. Register information and operation
  1681. * specifics are not exposed to the driver. Driver reads the template from
  1682. * flash and executes the instructions located at pre-defined offsets.
  1683. *
  1684. * Returns: None
  1685. * */
  1686. static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,
  1687. char *p_buff)
  1688. {
  1689. int index, entries;
  1690. struct qlc_83xx_entry_hdr *p_hdr;
  1691. char *entry = p_buff;
  1692. p_dev->ahw->reset.seq_end = 0;
  1693. p_dev->ahw->reset.template_end = 0;
  1694. entries = p_dev->ahw->reset.hdr->entries;
  1695. index = p_dev->ahw->reset.seq_index;
  1696. for (; (!p_dev->ahw->reset.seq_end) && (index < entries); index++) {
  1697. p_hdr = (struct qlc_83xx_entry_hdr *)entry;
  1698. switch (p_hdr->cmd) {
  1699. case QLC_83XX_OPCODE_NOP:
  1700. break;
  1701. case QLC_83XX_OPCODE_WRITE_LIST:
  1702. qlcnic_83xx_write_list(p_dev, p_hdr);
  1703. break;
  1704. case QLC_83XX_OPCODE_READ_WRITE_LIST:
  1705. qlcnic_83xx_read_write_list(p_dev, p_hdr);
  1706. break;
  1707. case QLC_83XX_OPCODE_POLL_LIST:
  1708. qlcnic_83xx_poll_list(p_dev, p_hdr);
  1709. break;
  1710. case QLC_83XX_OPCODE_POLL_WRITE_LIST:
  1711. qlcnic_83xx_poll_write_list(p_dev, p_hdr);
  1712. break;
  1713. case QLC_83XX_OPCODE_READ_MODIFY_WRITE:
  1714. qlcnic_83xx_read_modify_write(p_dev, p_hdr);
  1715. break;
  1716. case QLC_83XX_OPCODE_SEQ_PAUSE:
  1717. qlcnic_83xx_pause(p_hdr);
  1718. break;
  1719. case QLC_83XX_OPCODE_SEQ_END:
  1720. qlcnic_83xx_seq_end(p_dev);
  1721. break;
  1722. case QLC_83XX_OPCODE_TMPL_END:
  1723. qlcnic_83xx_template_end(p_dev);
  1724. break;
  1725. case QLC_83XX_OPCODE_POLL_READ_LIST:
  1726. qlcnic_83xx_poll_read_list(p_dev, p_hdr);
  1727. break;
  1728. default:
  1729. dev_err(&p_dev->pdev->dev,
  1730. "%s: Unknown opcode 0x%04x in template %d\n",
  1731. __func__, p_hdr->cmd, index);
  1732. break;
  1733. }
  1734. entry += p_hdr->size;
  1735. }
  1736. p_dev->ahw->reset.seq_index = index;
  1737. }
  1738. static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev)
  1739. {
  1740. p_dev->ahw->reset.seq_index = 0;
  1741. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.stop_offset);
  1742. if (p_dev->ahw->reset.seq_end != 1)
  1743. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1744. }
  1745. static void qlcnic_83xx_start_hw(struct qlcnic_adapter *p_dev)
  1746. {
  1747. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.start_offset);
  1748. if (p_dev->ahw->reset.template_end != 1)
  1749. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1750. }
  1751. static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
  1752. {
  1753. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.init_offset);
  1754. if (p_dev->ahw->reset.seq_end != 1)
  1755. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1756. }
  1757. static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
  1758. {
  1759. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1760. int err = -EIO;
  1761. if (request_firmware(&fw_info->fw, fw_info->fw_file_name,
  1762. &(adapter->pdev->dev))) {
  1763. dev_err(&adapter->pdev->dev,
  1764. "No file FW image, loading flash FW image.\n");
  1765. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1766. QLC_83XX_BOOT_FROM_FLASH);
  1767. } else {
  1768. if (qlcnic_83xx_copy_fw_file(adapter))
  1769. return err;
  1770. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1771. QLC_83XX_BOOT_FROM_FILE);
  1772. }
  1773. return 0;
  1774. }
  1775. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
  1776. {
  1777. u32 val;
  1778. int err = -EIO;
  1779. qlcnic_83xx_stop_hw(adapter);
  1780. /* Collect FW register dump if required */
  1781. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1782. if (!(val & QLC_83XX_IDC_GRACEFULL_RESET))
  1783. qlcnic_dump_fw(adapter);
  1784. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1785. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1786. __func__);
  1787. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  1788. return err;
  1789. }
  1790. qlcnic_83xx_init_hw(adapter);
  1791. if (qlcnic_83xx_copy_bootloader(adapter))
  1792. return err;
  1793. /* Boot either flash image or firmware image from host file system */
  1794. if (qlcnic_load_fw_file) {
  1795. if (qlcnic_83xx_load_fw_image_from_host(adapter))
  1796. return err;
  1797. } else {
  1798. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1799. QLC_83XX_BOOT_FROM_FLASH);
  1800. }
  1801. qlcnic_83xx_start_hw(adapter);
  1802. if (qlcnic_83xx_check_hw_status(adapter))
  1803. return -EIO;
  1804. return 0;
  1805. }
  1806. static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
  1807. {
  1808. int err;
  1809. struct qlcnic_info nic_info;
  1810. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1811. memset(&nic_info, 0, sizeof(struct qlcnic_info));
  1812. err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func);
  1813. if (err)
  1814. return -EIO;
  1815. ahw->physical_port = (u8) nic_info.phys_port;
  1816. ahw->switch_mode = nic_info.switch_mode;
  1817. ahw->max_tx_ques = nic_info.max_tx_ques;
  1818. ahw->max_rx_ques = nic_info.max_rx_ques;
  1819. ahw->capabilities = nic_info.capabilities;
  1820. ahw->max_mac_filters = nic_info.max_mac_filters;
  1821. ahw->max_mtu = nic_info.max_mtu;
  1822. /* eSwitch capability indicates vNIC mode.
  1823. * vNIC and SRIOV are mutually exclusive operational modes.
  1824. * If SR-IOV capability is detected, SR-IOV physical function
  1825. * will get initialized in default mode.
  1826. * SR-IOV virtual function initialization follows a
  1827. * different code path and opmode.
  1828. * SRIOV mode has precedence over vNIC mode.
  1829. */
  1830. if (test_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state))
  1831. return QLC_83XX_DEFAULT_OPMODE;
  1832. if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY)
  1833. return QLCNIC_VNIC_MODE;
  1834. return QLC_83XX_DEFAULT_OPMODE;
  1835. }
  1836. int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
  1837. {
  1838. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1839. u16 max_sds_rings, max_tx_rings;
  1840. int ret;
  1841. ret = qlcnic_83xx_get_nic_configuration(adapter);
  1842. if (ret == -EIO)
  1843. return -EIO;
  1844. if (ret == QLCNIC_VNIC_MODE) {
  1845. ahw->nic_mode = QLCNIC_VNIC_MODE;
  1846. if (qlcnic_83xx_config_vnic_opmode(adapter))
  1847. return -EIO;
  1848. max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
  1849. max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
  1850. } else if (ret == QLC_83XX_DEFAULT_OPMODE) {
  1851. ahw->nic_mode = QLCNIC_DEFAULT_MODE;
  1852. adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
  1853. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  1854. max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  1855. max_tx_rings = QLCNIC_MAX_TX_RINGS;
  1856. } else {
  1857. dev_err(&adapter->pdev->dev, "%s: Invalid opmode %d\n",
  1858. __func__, ret);
  1859. return -EIO;
  1860. }
  1861. adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
  1862. adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
  1863. return 0;
  1864. }
  1865. static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter)
  1866. {
  1867. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1868. if (ahw->port_type == QLCNIC_XGBE) {
  1869. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
  1870. adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
  1871. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1872. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1873. } else if (ahw->port_type == QLCNIC_GBE) {
  1874. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
  1875. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1876. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1877. adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
  1878. }
  1879. adapter->num_txd = MAX_CMD_DESCRIPTORS;
  1880. adapter->max_rds_rings = MAX_RDS_RINGS;
  1881. }
  1882. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter)
  1883. {
  1884. int err = -EIO;
  1885. qlcnic_83xx_get_minidump_template(adapter);
  1886. if (qlcnic_83xx_get_port_info(adapter))
  1887. return err;
  1888. qlcnic_83xx_config_buff_descriptors(adapter);
  1889. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  1890. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  1891. dev_info(&adapter->pdev->dev, "HAL Version: %d\n",
  1892. adapter->ahw->fw_hal_version);
  1893. return 0;
  1894. }
  1895. #define IS_QLC_83XX_USED(a, b, c) (((1 << a->portnum) & b) || ((c >> 6) & 0x1))
  1896. static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
  1897. {
  1898. struct qlcnic_cmd_args cmd;
  1899. u32 presence_mask, audit_mask;
  1900. int status;
  1901. presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  1902. audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  1903. if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
  1904. status = qlcnic_alloc_mbx_args(&cmd, adapter,
  1905. QLCNIC_CMD_STOP_NIC_FUNC);
  1906. if (status)
  1907. return;
  1908. cmd.req.arg[1] = BIT_31;
  1909. status = qlcnic_issue_cmd(adapter, &cmd);
  1910. if (status)
  1911. dev_err(&adapter->pdev->dev,
  1912. "Failed to clean up the function resources\n");
  1913. qlcnic_free_mbx_args(&cmd);
  1914. }
  1915. }
  1916. static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
  1917. {
  1918. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1919. struct pci_dev *pdev = adapter->pdev;
  1920. struct qlc_83xx_fw_info *fw_info;
  1921. int err = 0;
  1922. ahw->fw_info = kzalloc(sizeof(*fw_info), GFP_KERNEL);
  1923. if (!ahw->fw_info) {
  1924. err = -ENOMEM;
  1925. } else {
  1926. fw_info = ahw->fw_info;
  1927. switch (pdev->device) {
  1928. case PCI_DEVICE_ID_QLOGIC_QLE834X:
  1929. strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
  1930. QLC_FW_FILE_NAME_LEN);
  1931. break;
  1932. case PCI_DEVICE_ID_QLOGIC_QLE844X:
  1933. strncpy(fw_info->fw_file_name, QLC_84XX_FW_FILE_NAME,
  1934. QLC_FW_FILE_NAME_LEN);
  1935. break;
  1936. default:
  1937. dev_err(&pdev->dev, "%s: Invalid device id\n",
  1938. __func__);
  1939. err = -EINVAL;
  1940. break;
  1941. }
  1942. }
  1943. return err;
  1944. }
  1945. static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter)
  1946. {
  1947. u8 rx_cnt = QLCNIC_DEF_SDS_RINGS;
  1948. u8 tx_cnt = QLCNIC_DEF_TX_RINGS;
  1949. adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
  1950. adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  1951. if (!adapter->ahw->msix_supported) {
  1952. rx_cnt = QLCNIC_SINGLE_RING;
  1953. tx_cnt = QLCNIC_SINGLE_RING;
  1954. }
  1955. /* compute and set drv sds rings */
  1956. qlcnic_set_tx_ring_count(adapter, tx_cnt);
  1957. qlcnic_set_sds_ring_count(adapter, rx_cnt);
  1958. }
  1959. int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
  1960. {
  1961. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1962. int err = 0;
  1963. adapter->rx_mac_learn = false;
  1964. ahw->msix_supported = !!qlcnic_use_msi_x;
  1965. qlcnic_83xx_init_rings(adapter);
  1966. err = qlcnic_83xx_init_mailbox_work(adapter);
  1967. if (err)
  1968. goto exit;
  1969. if (qlcnic_sriov_vf_check(adapter)) {
  1970. err = qlcnic_sriov_vf_init(adapter, pci_using_dac);
  1971. if (err)
  1972. goto detach_mbx;
  1973. else
  1974. return err;
  1975. }
  1976. if (qlcnic_83xx_read_flash_descriptor_table(adapter) ||
  1977. qlcnic_83xx_read_flash_mfg_id(adapter)) {
  1978. dev_err(&adapter->pdev->dev, "Failed reading flash mfg id\n");
  1979. err = -ENOTRECOVERABLE;
  1980. goto detach_mbx;
  1981. }
  1982. err = qlcnic_83xx_check_hw_status(adapter);
  1983. if (err)
  1984. goto detach_mbx;
  1985. err = qlcnic_83xx_get_fw_info(adapter);
  1986. if (err)
  1987. goto detach_mbx;
  1988. err = qlcnic_83xx_idc_init(adapter);
  1989. if (err)
  1990. goto detach_mbx;
  1991. err = qlcnic_setup_intr(adapter);
  1992. if (err) {
  1993. dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
  1994. goto disable_intr;
  1995. }
  1996. INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
  1997. err = qlcnic_83xx_setup_mbx_intr(adapter);
  1998. if (err)
  1999. goto disable_mbx_intr;
  2000. qlcnic_83xx_clear_function_resources(adapter);
  2001. qlcnic_dcb_enable(adapter->dcb);
  2002. qlcnic_83xx_initialize_nic(adapter, 1);
  2003. qlcnic_dcb_get_info(adapter->dcb);
  2004. /* Configure default, SR-IOV or Virtual NIC mode of operation */
  2005. err = qlcnic_83xx_configure_opmode(adapter);
  2006. if (err)
  2007. goto disable_mbx_intr;
  2008. /* Perform operating mode specific initialization */
  2009. err = adapter->nic_ops->init_driver(adapter);
  2010. if (err)
  2011. goto disable_mbx_intr;
  2012. /* Periodically monitor device status */
  2013. qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
  2014. return 0;
  2015. disable_mbx_intr:
  2016. qlcnic_83xx_free_mbx_intr(adapter);
  2017. disable_intr:
  2018. qlcnic_teardown_intr(adapter);
  2019. detach_mbx:
  2020. qlcnic_83xx_detach_mailbox_work(adapter);
  2021. qlcnic_83xx_free_mailbox(ahw->mailbox);
  2022. ahw->mailbox = NULL;
  2023. exit:
  2024. return err;
  2025. }
  2026. void qlcnic_83xx_aer_stop_poll_work(struct qlcnic_adapter *adapter)
  2027. {
  2028. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2029. struct qlc_83xx_idc *idc = &ahw->idc;
  2030. clear_bit(QLC_83XX_MBX_READY, &idc->status);
  2031. cancel_delayed_work_sync(&adapter->fw_work);
  2032. if (ahw->nic_mode == QLCNIC_VNIC_MODE)
  2033. qlcnic_83xx_disable_vnic_mode(adapter, 1);
  2034. qlcnic_83xx_idc_detach_driver(adapter);
  2035. qlcnic_83xx_initialize_nic(adapter, 0);
  2036. cancel_delayed_work_sync(&adapter->idc_aen_work);
  2037. }
  2038. int qlcnic_83xx_aer_reset(struct qlcnic_adapter *adapter)
  2039. {
  2040. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2041. struct qlc_83xx_idc *idc = &ahw->idc;
  2042. int ret = 0;
  2043. u32 owner;
  2044. /* Mark the previous IDC state as NEED_RESET so
  2045. * that state_entry() will perform the reattachment
  2046. * and bringup the device
  2047. */
  2048. idc->prev_state = QLC_83XX_IDC_DEV_NEED_RESET;
  2049. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2050. if (ahw->pci_func == owner) {
  2051. ret = qlcnic_83xx_restart_hw(adapter);
  2052. if (ret < 0)
  2053. return ret;
  2054. qlcnic_83xx_idc_clear_registers(adapter, 0);
  2055. }
  2056. ret = idc->state_entry(adapter);
  2057. return ret;
  2058. }
  2059. void qlcnic_83xx_aer_start_poll_work(struct qlcnic_adapter *adapter)
  2060. {
  2061. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2062. struct qlc_83xx_idc *idc = &ahw->idc;
  2063. u32 owner;
  2064. idc->prev_state = QLC_83XX_IDC_DEV_READY;
  2065. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2066. if (ahw->pci_func == owner)
  2067. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  2068. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 0);
  2069. }