qlcnic_83xx_init.c 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613
  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 graceful 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 received 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. #define QLC_83XX_ENCAP_TYPE_VXLAN BIT_1
  871. #define QLC_83XX_MATCH_ENCAP_ID BIT_2
  872. #define QLC_83XX_SET_VXLAN_UDP_DPORT BIT_3
  873. #define QLC_83XX_VXLAN_UDP_DPORT(PORT) ((PORT & 0xffff) << 16)
  874. #define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
  875. #define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0
  876. static int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter)
  877. {
  878. u16 port = adapter->ahw->vxlan_port;
  879. struct qlcnic_cmd_args cmd;
  880. int ret = 0;
  881. memset(&cmd, 0, sizeof(cmd));
  882. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  883. QLCNIC_CMD_INIT_NIC_FUNC);
  884. if (ret)
  885. return ret;
  886. cmd.req.arg[1] = QLC_83XX_MULTI_TENANCY_INFO;
  887. cmd.req.arg[2] = QLC_83XX_ENCAP_TYPE_VXLAN |
  888. QLC_83XX_SET_VXLAN_UDP_DPORT |
  889. QLC_83XX_VXLAN_UDP_DPORT(port);
  890. ret = qlcnic_issue_cmd(adapter, &cmd);
  891. if (ret)
  892. netdev_err(adapter->netdev,
  893. "Failed to set VXLAN port %d in adapter\n",
  894. port);
  895. qlcnic_free_mbx_args(&cmd);
  896. return ret;
  897. }
  898. static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter,
  899. bool state)
  900. {
  901. u16 vxlan_port = adapter->ahw->vxlan_port;
  902. struct qlcnic_cmd_args cmd;
  903. int ret = 0;
  904. memset(&cmd, 0, sizeof(cmd));
  905. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  906. QLCNIC_CMD_SET_INGRESS_ENCAP);
  907. if (ret)
  908. return ret;
  909. cmd.req.arg[1] = state ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
  910. QLCNIC_DISABLE_INGRESS_ENCAP_PARSING;
  911. ret = qlcnic_issue_cmd(adapter, &cmd);
  912. if (ret)
  913. netdev_err(adapter->netdev,
  914. "Failed to %s VXLAN parsing for port %d\n",
  915. state ? "enable" : "disable", vxlan_port);
  916. else
  917. netdev_info(adapter->netdev,
  918. "%s VXLAN parsing for port %d\n",
  919. state ? "Enabled" : "Disabled", vxlan_port);
  920. qlcnic_free_mbx_args(&cmd);
  921. return ret;
  922. }
  923. static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
  924. {
  925. if (adapter->fhash.fnum)
  926. qlcnic_prune_lb_filters(adapter);
  927. if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) {
  928. if (qlcnic_set_vxlan_port(adapter))
  929. return;
  930. if (qlcnic_set_vxlan_parsing(adapter, true))
  931. return;
  932. adapter->flags &= ~QLCNIC_ADD_VXLAN_PORT;
  933. } else if (adapter->flags & QLCNIC_DEL_VXLAN_PORT) {
  934. if (qlcnic_set_vxlan_parsing(adapter, false))
  935. return;
  936. adapter->ahw->vxlan_port = 0;
  937. adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT;
  938. }
  939. }
  940. /**
  941. * qlcnic_83xx_idc_poll_dev_state
  942. *
  943. * @work: kernel work queue structure used to schedule the function
  944. *
  945. * Poll device state periodically and perform state specific
  946. * actions defined by Inter Driver Communication (IDC) protocol.
  947. *
  948. * Returns: None
  949. *
  950. **/
  951. void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work)
  952. {
  953. struct qlcnic_adapter *adapter;
  954. u32 state;
  955. adapter = container_of(work, struct qlcnic_adapter, fw_work.work);
  956. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  957. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  958. qlcnic_83xx_idc_log_state_history(adapter);
  959. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  960. } else {
  961. adapter->ahw->idc.curr_state = state;
  962. }
  963. switch (adapter->ahw->idc.curr_state) {
  964. case QLC_83XX_IDC_DEV_READY:
  965. qlcnic_83xx_idc_ready_state(adapter);
  966. break;
  967. case QLC_83XX_IDC_DEV_NEED_RESET:
  968. qlcnic_83xx_idc_need_reset_state(adapter);
  969. break;
  970. case QLC_83XX_IDC_DEV_NEED_QUISCENT:
  971. qlcnic_83xx_idc_need_quiesce_state(adapter);
  972. break;
  973. case QLC_83XX_IDC_DEV_FAILED:
  974. qlcnic_83xx_idc_failed_state(adapter);
  975. return;
  976. case QLC_83XX_IDC_DEV_INIT:
  977. qlcnic_83xx_idc_init_state(adapter);
  978. break;
  979. case QLC_83XX_IDC_DEV_QUISCENT:
  980. qlcnic_83xx_idc_quiesce_state(adapter);
  981. break;
  982. default:
  983. qlcnic_83xx_idc_unknown_state(adapter);
  984. return;
  985. }
  986. adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state;
  987. qlcnic_83xx_periodic_tasks(adapter);
  988. /* Re-schedule the function */
  989. if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status))
  990. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
  991. adapter->ahw->idc.delay);
  992. }
  993. static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter)
  994. {
  995. u32 idc_params, val;
  996. if (qlcnic_83xx_flash_read32(adapter, QLC_83XX_IDC_FLASH_PARAM_ADDR,
  997. (u8 *)&idc_params, 1)) {
  998. dev_info(&adapter->pdev->dev,
  999. "%s:failed to get IDC params from flash\n", __func__);
  1000. adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  1001. adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  1002. } else {
  1003. adapter->dev_init_timeo = idc_params & 0xFFFF;
  1004. adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF);
  1005. }
  1006. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1007. adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1008. adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  1009. adapter->ahw->idc.err_code = 0;
  1010. adapter->ahw->idc.collect_dump = 0;
  1011. adapter->ahw->idc.name = (char **)qlc_83xx_idc_states;
  1012. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1013. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1014. /* Check if reset recovery is disabled */
  1015. if (!qlcnic_auto_fw_reset) {
  1016. /* Propagate do not reset request to other functions */
  1017. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1018. val = val | QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1019. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1020. }
  1021. }
  1022. static int
  1023. qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
  1024. {
  1025. u32 state, val;
  1026. if (qlcnic_83xx_lock_driver(adapter))
  1027. return -EIO;
  1028. /* Clear driver lock register */
  1029. QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0);
  1030. if (qlcnic_83xx_idc_update_major_version(adapter, 0)) {
  1031. qlcnic_83xx_unlock_driver(adapter);
  1032. return -EIO;
  1033. }
  1034. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  1035. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  1036. qlcnic_83xx_unlock_driver(adapter);
  1037. return -EIO;
  1038. }
  1039. if (state != QLC_83XX_IDC_DEV_COLD && qlcnic_load_fw_file) {
  1040. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  1041. QLC_83XX_IDC_DEV_COLD);
  1042. state = QLC_83XX_IDC_DEV_COLD;
  1043. }
  1044. adapter->ahw->idc.curr_state = state;
  1045. /* First to load function should cold boot the device */
  1046. if (state == QLC_83XX_IDC_DEV_COLD)
  1047. qlcnic_83xx_idc_cold_state_handler(adapter);
  1048. /* Check if reset recovery is enabled */
  1049. if (qlcnic_auto_fw_reset) {
  1050. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1051. val = val & ~QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1052. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1053. }
  1054. qlcnic_83xx_unlock_driver(adapter);
  1055. return 0;
  1056. }
  1057. int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
  1058. {
  1059. int ret = -EIO;
  1060. qlcnic_83xx_setup_idc_parameters(adapter);
  1061. if (qlcnic_83xx_get_reset_instruction_template(adapter))
  1062. return ret;
  1063. if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) {
  1064. if (qlcnic_83xx_idc_first_to_load_function_handler(adapter))
  1065. return -EIO;
  1066. } else {
  1067. if (qlcnic_83xx_idc_check_major_version(adapter))
  1068. return -EIO;
  1069. }
  1070. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  1071. return 0;
  1072. }
  1073. void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter)
  1074. {
  1075. int id;
  1076. u32 val;
  1077. while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  1078. usleep_range(10000, 11000);
  1079. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1080. id = id & 0xFF;
  1081. if (id == adapter->portnum) {
  1082. dev_err(&adapter->pdev->dev,
  1083. "%s: wait for lock recovery.. %d\n", __func__, id);
  1084. msleep(20);
  1085. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1086. id = id & 0xFF;
  1087. }
  1088. /* Clear driver presence bit */
  1089. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  1090. val = val & ~(1 << adapter->portnum);
  1091. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  1092. clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1093. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1094. cancel_delayed_work_sync(&adapter->fw_work);
  1095. }
  1096. void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key)
  1097. {
  1098. u32 val;
  1099. if (qlcnic_sriov_vf_check(adapter))
  1100. return;
  1101. if (qlcnic_83xx_lock_driver(adapter)) {
  1102. dev_err(&adapter->pdev->dev,
  1103. "%s:failed, please retry\n", __func__);
  1104. return;
  1105. }
  1106. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1107. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1108. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1109. __func__);
  1110. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  1111. qlcnic_83xx_unlock_driver(adapter);
  1112. return;
  1113. }
  1114. if (key == QLCNIC_FORCE_FW_RESET) {
  1115. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1116. val = val | QLC_83XX_IDC_GRACEFULL_RESET;
  1117. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1118. } else if (key == QLCNIC_FORCE_FW_DUMP_KEY) {
  1119. adapter->ahw->idc.collect_dump = 1;
  1120. }
  1121. qlcnic_83xx_unlock_driver(adapter);
  1122. return;
  1123. }
  1124. static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
  1125. {
  1126. u8 *p_cache;
  1127. u32 src, size;
  1128. u64 dest;
  1129. int ret = -EIO;
  1130. src = QLC_83XX_BOOTLOADER_FLASH_ADDR;
  1131. dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR);
  1132. size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE);
  1133. /* alignment check */
  1134. if (size & 0xF)
  1135. size = (size + 16) & ~0xF;
  1136. p_cache = vzalloc(size);
  1137. if (p_cache == NULL)
  1138. return -ENOMEM;
  1139. ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache,
  1140. size / sizeof(u32));
  1141. if (ret) {
  1142. vfree(p_cache);
  1143. return ret;
  1144. }
  1145. /* 16 byte write to MS memory */
  1146. ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache,
  1147. size / 16);
  1148. if (ret) {
  1149. vfree(p_cache);
  1150. return ret;
  1151. }
  1152. vfree(p_cache);
  1153. return ret;
  1154. }
  1155. static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
  1156. {
  1157. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1158. const struct firmware *fw = fw_info->fw;
  1159. u32 dest, *p_cache, *temp;
  1160. int i, ret = -EIO;
  1161. __le32 *temp_le;
  1162. u8 data[16];
  1163. size_t size;
  1164. u64 addr;
  1165. temp = vzalloc(fw->size);
  1166. if (!temp) {
  1167. release_firmware(fw);
  1168. fw_info->fw = NULL;
  1169. return -ENOMEM;
  1170. }
  1171. temp_le = (__le32 *)fw->data;
  1172. /* FW image in file is in little endian, swap the data to nullify
  1173. * the effect of writel() operation on big endian platform.
  1174. */
  1175. for (i = 0; i < fw->size / sizeof(u32); i++)
  1176. temp[i] = __le32_to_cpu(temp_le[i]);
  1177. dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
  1178. size = (fw->size & ~0xF);
  1179. p_cache = temp;
  1180. addr = (u64)dest;
  1181. ret = qlcnic_ms_mem_write128(adapter, addr,
  1182. p_cache, size / 16);
  1183. if (ret) {
  1184. dev_err(&adapter->pdev->dev, "MS memory write failed\n");
  1185. goto exit;
  1186. }
  1187. /* alignment check */
  1188. if (fw->size & 0xF) {
  1189. addr = dest + size;
  1190. for (i = 0; i < (fw->size & 0xF); i++)
  1191. data[i] = ((u8 *)temp)[size + i];
  1192. for (; i < 16; i++)
  1193. data[i] = 0;
  1194. ret = qlcnic_ms_mem_write128(adapter, addr,
  1195. (u32 *)data, 1);
  1196. if (ret) {
  1197. dev_err(&adapter->pdev->dev,
  1198. "MS memory write failed\n");
  1199. goto exit;
  1200. }
  1201. }
  1202. exit:
  1203. release_firmware(fw);
  1204. fw_info->fw = NULL;
  1205. vfree(temp);
  1206. return ret;
  1207. }
  1208. static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
  1209. {
  1210. int i, j;
  1211. u32 val = 0, val1 = 0, reg = 0;
  1212. int err = 0;
  1213. val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
  1214. if (err == -EIO)
  1215. return;
  1216. dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
  1217. for (j = 0; j < 2; j++) {
  1218. if (j == 0) {
  1219. dev_info(&adapter->pdev->dev,
  1220. "Port 0 RxB Pause Threshold Regs[TC7..TC0]:");
  1221. reg = QLC_83XX_PORT0_THRESHOLD;
  1222. } else if (j == 1) {
  1223. dev_info(&adapter->pdev->dev,
  1224. "Port 1 RxB Pause Threshold Regs[TC7..TC0]:");
  1225. reg = QLC_83XX_PORT1_THRESHOLD;
  1226. }
  1227. for (i = 0; i < 8; i++) {
  1228. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1229. if (err == -EIO)
  1230. return;
  1231. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1232. }
  1233. dev_info(&adapter->pdev->dev, "\n");
  1234. }
  1235. for (j = 0; j < 2; j++) {
  1236. if (j == 0) {
  1237. dev_info(&adapter->pdev->dev,
  1238. "Port 0 RxB TC Max Cell Registers[4..1]:");
  1239. reg = QLC_83XX_PORT0_TC_MC_REG;
  1240. } else if (j == 1) {
  1241. dev_info(&adapter->pdev->dev,
  1242. "Port 1 RxB TC Max Cell Registers[4..1]:");
  1243. reg = QLC_83XX_PORT1_TC_MC_REG;
  1244. }
  1245. for (i = 0; i < 4; i++) {
  1246. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1247. if (err == -EIO)
  1248. return;
  1249. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1250. }
  1251. dev_info(&adapter->pdev->dev, "\n");
  1252. }
  1253. for (j = 0; j < 2; j++) {
  1254. if (j == 0) {
  1255. dev_info(&adapter->pdev->dev,
  1256. "Port 0 RxB Rx TC Stats[TC7..TC0]:");
  1257. reg = QLC_83XX_PORT0_TC_STATS;
  1258. } else if (j == 1) {
  1259. dev_info(&adapter->pdev->dev,
  1260. "Port 1 RxB Rx TC Stats[TC7..TC0]:");
  1261. reg = QLC_83XX_PORT1_TC_STATS;
  1262. }
  1263. for (i = 7; i >= 0; i--) {
  1264. val = QLCRD32(adapter, reg, &err);
  1265. if (err == -EIO)
  1266. return;
  1267. val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
  1268. QLCWR32(adapter, reg, (val | (i << 29)));
  1269. val = QLCRD32(adapter, reg, &err);
  1270. if (err == -EIO)
  1271. return;
  1272. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1273. }
  1274. dev_info(&adapter->pdev->dev, "\n");
  1275. }
  1276. val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
  1277. if (err == -EIO)
  1278. return;
  1279. val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
  1280. if (err == -EIO)
  1281. return;
  1282. dev_info(&adapter->pdev->dev,
  1283. "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
  1284. val, val1);
  1285. }
  1286. static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
  1287. {
  1288. u32 reg = 0, i, j;
  1289. if (qlcnic_83xx_lock_driver(adapter)) {
  1290. dev_err(&adapter->pdev->dev,
  1291. "%s:failed to acquire driver lock\n", __func__);
  1292. return;
  1293. }
  1294. qlcnic_83xx_dump_pause_control_regs(adapter);
  1295. QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0);
  1296. for (j = 0; j < 2; j++) {
  1297. if (j == 0)
  1298. reg = QLC_83XX_PORT0_THRESHOLD;
  1299. else if (j == 1)
  1300. reg = QLC_83XX_PORT1_THRESHOLD;
  1301. for (i = 0; i < 8; i++)
  1302. QLCWR32(adapter, reg + (i * 0x4), 0x0);
  1303. }
  1304. for (j = 0; j < 2; j++) {
  1305. if (j == 0)
  1306. reg = QLC_83XX_PORT0_TC_MC_REG;
  1307. else if (j == 1)
  1308. reg = QLC_83XX_PORT1_TC_MC_REG;
  1309. for (i = 0; i < 4; i++)
  1310. QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF);
  1311. }
  1312. QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0);
  1313. QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0);
  1314. dev_info(&adapter->pdev->dev,
  1315. "Disabled pause frames successfully on all ports\n");
  1316. qlcnic_83xx_unlock_driver(adapter);
  1317. }
  1318. static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
  1319. {
  1320. QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
  1321. QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
  1322. QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
  1323. QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
  1324. QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
  1325. QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
  1326. QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
  1327. QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
  1328. QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
  1329. }
  1330. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
  1331. {
  1332. u32 heartbeat, peg_status;
  1333. int retries, ret = -EIO, err = 0;
  1334. retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
  1335. p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1336. QLCNIC_PEG_ALIVE_COUNTER);
  1337. do {
  1338. msleep(QLCNIC_HEARTBEAT_PERIOD_MSECS);
  1339. heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1340. QLCNIC_PEG_ALIVE_COUNTER);
  1341. if (heartbeat != p_dev->heartbeat) {
  1342. ret = QLCNIC_RCODE_SUCCESS;
  1343. break;
  1344. }
  1345. } while (--retries);
  1346. if (ret) {
  1347. dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
  1348. qlcnic_83xx_take_eport_out_of_reset(p_dev);
  1349. qlcnic_83xx_disable_pause_frames(p_dev);
  1350. peg_status = QLC_SHARED_REG_RD32(p_dev,
  1351. QLCNIC_PEG_HALT_STATUS1);
  1352. dev_info(&p_dev->pdev->dev, "Dumping HW/FW registers\n"
  1353. "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
  1354. "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
  1355. "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
  1356. "PEG_NET_4_PC: 0x%x\n", peg_status,
  1357. QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
  1358. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
  1359. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
  1360. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
  1361. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
  1362. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
  1363. if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
  1364. dev_err(&p_dev->pdev->dev,
  1365. "Device is being reset err code 0x00006700.\n");
  1366. }
  1367. return ret;
  1368. }
  1369. static int qlcnic_83xx_check_cmd_peg_status(struct qlcnic_adapter *p_dev)
  1370. {
  1371. int retries = QLCNIC_CMDPEG_CHECK_RETRY_COUNT;
  1372. u32 val;
  1373. do {
  1374. val = QLC_SHARED_REG_RD32(p_dev, QLCNIC_CMDPEG_STATE);
  1375. if (val == QLC_83XX_CMDPEG_COMPLETE)
  1376. return 0;
  1377. msleep(QLCNIC_CMDPEG_CHECK_DELAY);
  1378. } while (--retries);
  1379. dev_err(&p_dev->pdev->dev, "%s: failed, state = 0x%x\n", __func__, val);
  1380. return -EIO;
  1381. }
  1382. static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
  1383. {
  1384. int err;
  1385. err = qlcnic_83xx_check_cmd_peg_status(p_dev);
  1386. if (err)
  1387. return err;
  1388. err = qlcnic_83xx_check_heartbeat(p_dev);
  1389. if (err)
  1390. return err;
  1391. return err;
  1392. }
  1393. static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
  1394. int duration, u32 mask, u32 status)
  1395. {
  1396. int timeout_error, err = 0;
  1397. u32 value;
  1398. u8 retries;
  1399. value = QLCRD32(p_dev, addr, &err);
  1400. if (err == -EIO)
  1401. return err;
  1402. retries = duration / 10;
  1403. do {
  1404. if ((value & mask) != status) {
  1405. timeout_error = 1;
  1406. msleep(duration / 10);
  1407. value = QLCRD32(p_dev, addr, &err);
  1408. if (err == -EIO)
  1409. return err;
  1410. } else {
  1411. timeout_error = 0;
  1412. break;
  1413. }
  1414. } while (retries--);
  1415. if (timeout_error) {
  1416. p_dev->ahw->reset.seq_error++;
  1417. dev_err(&p_dev->pdev->dev,
  1418. "%s: Timeout Err, entry_num = %d\n",
  1419. __func__, p_dev->ahw->reset.seq_index);
  1420. dev_err(&p_dev->pdev->dev,
  1421. "0x%08x 0x%08x 0x%08x\n",
  1422. value, mask, status);
  1423. }
  1424. return timeout_error;
  1425. }
  1426. static int qlcnic_83xx_reset_template_checksum(struct qlcnic_adapter *p_dev)
  1427. {
  1428. u32 sum = 0;
  1429. u16 *buff = (u16 *)p_dev->ahw->reset.buff;
  1430. int count = p_dev->ahw->reset.hdr->size / sizeof(u16);
  1431. while (count-- > 0)
  1432. sum += *buff++;
  1433. while (sum >> 16)
  1434. sum = (sum & 0xFFFF) + (sum >> 16);
  1435. if (~sum) {
  1436. return 0;
  1437. } else {
  1438. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1439. return -1;
  1440. }
  1441. }
  1442. static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
  1443. {
  1444. struct qlcnic_hardware_context *ahw = p_dev->ahw;
  1445. u32 addr, count, prev_ver, curr_ver;
  1446. u8 *p_buff;
  1447. if (ahw->reset.buff != NULL) {
  1448. prev_ver = p_dev->fw_version;
  1449. curr_ver = qlcnic_83xx_get_fw_version(p_dev);
  1450. if (curr_ver > prev_ver)
  1451. kfree(ahw->reset.buff);
  1452. else
  1453. return 0;
  1454. }
  1455. ahw->reset.seq_error = 0;
  1456. ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL);
  1457. if (p_dev->ahw->reset.buff == NULL)
  1458. return -ENOMEM;
  1459. p_buff = p_dev->ahw->reset.buff;
  1460. addr = QLC_83XX_RESET_TEMPLATE_ADDR;
  1461. count = sizeof(struct qlc_83xx_reset_hdr) / sizeof(u32);
  1462. /* Copy template header from flash */
  1463. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1464. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1465. return -EIO;
  1466. }
  1467. ahw->reset.hdr = (struct qlc_83xx_reset_hdr *)ahw->reset.buff;
  1468. addr = QLC_83XX_RESET_TEMPLATE_ADDR + ahw->reset.hdr->hdr_size;
  1469. p_buff = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1470. count = (ahw->reset.hdr->size - ahw->reset.hdr->hdr_size) / sizeof(u32);
  1471. /* Copy rest of the template */
  1472. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1473. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1474. return -EIO;
  1475. }
  1476. if (qlcnic_83xx_reset_template_checksum(p_dev))
  1477. return -EIO;
  1478. /* Get Stop, Start and Init command offsets */
  1479. ahw->reset.init_offset = ahw->reset.buff + ahw->reset.hdr->init_offset;
  1480. ahw->reset.start_offset = ahw->reset.buff +
  1481. ahw->reset.hdr->start_offset;
  1482. ahw->reset.stop_offset = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1483. return 0;
  1484. }
  1485. /* Read Write HW register command */
  1486. static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
  1487. u32 raddr, u32 waddr)
  1488. {
  1489. int err = 0;
  1490. u32 value;
  1491. value = QLCRD32(p_dev, raddr, &err);
  1492. if (err == -EIO)
  1493. return;
  1494. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1495. }
  1496. /* Read Modify Write HW register command */
  1497. static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
  1498. u32 raddr, u32 waddr,
  1499. struct qlc_83xx_rmw *p_rmw_hdr)
  1500. {
  1501. int err = 0;
  1502. u32 value;
  1503. if (p_rmw_hdr->index_a) {
  1504. value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
  1505. } else {
  1506. value = QLCRD32(p_dev, raddr, &err);
  1507. if (err == -EIO)
  1508. return;
  1509. }
  1510. value &= p_rmw_hdr->mask;
  1511. value <<= p_rmw_hdr->shl;
  1512. value >>= p_rmw_hdr->shr;
  1513. value |= p_rmw_hdr->or_value;
  1514. value ^= p_rmw_hdr->xor_value;
  1515. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1516. }
  1517. /* Write HW register command */
  1518. static void qlcnic_83xx_write_list(struct qlcnic_adapter *p_dev,
  1519. struct qlc_83xx_entry_hdr *p_hdr)
  1520. {
  1521. int i;
  1522. struct qlc_83xx_entry *entry;
  1523. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1524. sizeof(struct qlc_83xx_entry_hdr));
  1525. for (i = 0; i < p_hdr->count; i++, entry++) {
  1526. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->arg1,
  1527. entry->arg2);
  1528. if (p_hdr->delay)
  1529. udelay((u32)(p_hdr->delay));
  1530. }
  1531. }
  1532. /* Read and Write instruction */
  1533. static void qlcnic_83xx_read_write_list(struct qlcnic_adapter *p_dev,
  1534. struct qlc_83xx_entry_hdr *p_hdr)
  1535. {
  1536. int i;
  1537. struct qlc_83xx_entry *entry;
  1538. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1539. sizeof(struct qlc_83xx_entry_hdr));
  1540. for (i = 0; i < p_hdr->count; i++, entry++) {
  1541. qlcnic_83xx_read_write_crb_reg(p_dev, entry->arg1,
  1542. entry->arg2);
  1543. if (p_hdr->delay)
  1544. udelay((u32)(p_hdr->delay));
  1545. }
  1546. }
  1547. /* Poll HW register command */
  1548. static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
  1549. struct qlc_83xx_entry_hdr *p_hdr)
  1550. {
  1551. long delay;
  1552. struct qlc_83xx_entry *entry;
  1553. struct qlc_83xx_poll *poll;
  1554. int i, err = 0;
  1555. unsigned long arg1, arg2;
  1556. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1557. sizeof(struct qlc_83xx_entry_hdr));
  1558. entry = (struct qlc_83xx_entry *)((char *)poll +
  1559. sizeof(struct qlc_83xx_poll));
  1560. delay = (long)p_hdr->delay;
  1561. if (!delay) {
  1562. for (i = 0; i < p_hdr->count; i++, entry++)
  1563. qlcnic_83xx_poll_reg(p_dev, entry->arg1,
  1564. delay, poll->mask,
  1565. poll->status);
  1566. } else {
  1567. for (i = 0; i < p_hdr->count; i++, entry++) {
  1568. arg1 = entry->arg1;
  1569. arg2 = entry->arg2;
  1570. if (delay) {
  1571. if (qlcnic_83xx_poll_reg(p_dev,
  1572. arg1, delay,
  1573. poll->mask,
  1574. poll->status)){
  1575. QLCRD32(p_dev, arg1, &err);
  1576. if (err == -EIO)
  1577. return;
  1578. QLCRD32(p_dev, arg2, &err);
  1579. if (err == -EIO)
  1580. return;
  1581. }
  1582. }
  1583. }
  1584. }
  1585. }
  1586. /* Poll and write HW register command */
  1587. static void qlcnic_83xx_poll_write_list(struct qlcnic_adapter *p_dev,
  1588. struct qlc_83xx_entry_hdr *p_hdr)
  1589. {
  1590. int i;
  1591. long delay;
  1592. struct qlc_83xx_quad_entry *entry;
  1593. struct qlc_83xx_poll *poll;
  1594. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1595. sizeof(struct qlc_83xx_entry_hdr));
  1596. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1597. sizeof(struct qlc_83xx_poll));
  1598. delay = (long)p_hdr->delay;
  1599. for (i = 0; i < p_hdr->count; i++, entry++) {
  1600. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->dr_addr,
  1601. entry->dr_value);
  1602. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1603. entry->ar_value);
  1604. if (delay)
  1605. qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1606. poll->mask, poll->status);
  1607. }
  1608. }
  1609. /* Read Modify Write register command */
  1610. static void qlcnic_83xx_read_modify_write(struct qlcnic_adapter *p_dev,
  1611. struct qlc_83xx_entry_hdr *p_hdr)
  1612. {
  1613. int i;
  1614. struct qlc_83xx_entry *entry;
  1615. struct qlc_83xx_rmw *rmw_hdr;
  1616. rmw_hdr = (struct qlc_83xx_rmw *)((char *)p_hdr +
  1617. sizeof(struct qlc_83xx_entry_hdr));
  1618. entry = (struct qlc_83xx_entry *)((char *)rmw_hdr +
  1619. sizeof(struct qlc_83xx_rmw));
  1620. for (i = 0; i < p_hdr->count; i++, entry++) {
  1621. qlcnic_83xx_rmw_crb_reg(p_dev, entry->arg1,
  1622. entry->arg2, rmw_hdr);
  1623. if (p_hdr->delay)
  1624. udelay((u32)(p_hdr->delay));
  1625. }
  1626. }
  1627. static void qlcnic_83xx_pause(struct qlc_83xx_entry_hdr *p_hdr)
  1628. {
  1629. if (p_hdr->delay)
  1630. mdelay((u32)((long)p_hdr->delay));
  1631. }
  1632. /* Read and poll register command */
  1633. static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
  1634. struct qlc_83xx_entry_hdr *p_hdr)
  1635. {
  1636. long delay;
  1637. int index, i, j, err;
  1638. struct qlc_83xx_quad_entry *entry;
  1639. struct qlc_83xx_poll *poll;
  1640. unsigned long addr;
  1641. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1642. sizeof(struct qlc_83xx_entry_hdr));
  1643. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1644. sizeof(struct qlc_83xx_poll));
  1645. delay = (long)p_hdr->delay;
  1646. for (i = 0; i < p_hdr->count; i++, entry++) {
  1647. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1648. entry->ar_value);
  1649. if (delay) {
  1650. if (!qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1651. poll->mask, poll->status)){
  1652. index = p_dev->ahw->reset.array_index;
  1653. addr = entry->dr_addr;
  1654. j = QLCRD32(p_dev, addr, &err);
  1655. if (err == -EIO)
  1656. return;
  1657. p_dev->ahw->reset.array[index++] = j;
  1658. if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
  1659. p_dev->ahw->reset.array_index = 1;
  1660. }
  1661. }
  1662. }
  1663. }
  1664. static inline void qlcnic_83xx_seq_end(struct qlcnic_adapter *p_dev)
  1665. {
  1666. p_dev->ahw->reset.seq_end = 1;
  1667. }
  1668. static void qlcnic_83xx_template_end(struct qlcnic_adapter *p_dev)
  1669. {
  1670. p_dev->ahw->reset.template_end = 1;
  1671. if (p_dev->ahw->reset.seq_error == 0)
  1672. dev_err(&p_dev->pdev->dev,
  1673. "HW restart process completed successfully.\n");
  1674. else
  1675. dev_err(&p_dev->pdev->dev,
  1676. "HW restart completed with timeout errors.\n");
  1677. }
  1678. /**
  1679. * qlcnic_83xx_exec_template_cmd
  1680. *
  1681. * @p_dev: adapter structure
  1682. * @p_buff: Poiter to instruction template
  1683. *
  1684. * Template provides instructions to stop, restart and initalize firmware.
  1685. * These instructions are abstracted as a series of read, write and
  1686. * poll operations on hardware registers. Register information and operation
  1687. * specifics are not exposed to the driver. Driver reads the template from
  1688. * flash and executes the instructions located at pre-defined offsets.
  1689. *
  1690. * Returns: None
  1691. * */
  1692. static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,
  1693. char *p_buff)
  1694. {
  1695. int index, entries;
  1696. struct qlc_83xx_entry_hdr *p_hdr;
  1697. char *entry = p_buff;
  1698. p_dev->ahw->reset.seq_end = 0;
  1699. p_dev->ahw->reset.template_end = 0;
  1700. entries = p_dev->ahw->reset.hdr->entries;
  1701. index = p_dev->ahw->reset.seq_index;
  1702. for (; (!p_dev->ahw->reset.seq_end) && (index < entries); index++) {
  1703. p_hdr = (struct qlc_83xx_entry_hdr *)entry;
  1704. switch (p_hdr->cmd) {
  1705. case QLC_83XX_OPCODE_NOP:
  1706. break;
  1707. case QLC_83XX_OPCODE_WRITE_LIST:
  1708. qlcnic_83xx_write_list(p_dev, p_hdr);
  1709. break;
  1710. case QLC_83XX_OPCODE_READ_WRITE_LIST:
  1711. qlcnic_83xx_read_write_list(p_dev, p_hdr);
  1712. break;
  1713. case QLC_83XX_OPCODE_POLL_LIST:
  1714. qlcnic_83xx_poll_list(p_dev, p_hdr);
  1715. break;
  1716. case QLC_83XX_OPCODE_POLL_WRITE_LIST:
  1717. qlcnic_83xx_poll_write_list(p_dev, p_hdr);
  1718. break;
  1719. case QLC_83XX_OPCODE_READ_MODIFY_WRITE:
  1720. qlcnic_83xx_read_modify_write(p_dev, p_hdr);
  1721. break;
  1722. case QLC_83XX_OPCODE_SEQ_PAUSE:
  1723. qlcnic_83xx_pause(p_hdr);
  1724. break;
  1725. case QLC_83XX_OPCODE_SEQ_END:
  1726. qlcnic_83xx_seq_end(p_dev);
  1727. break;
  1728. case QLC_83XX_OPCODE_TMPL_END:
  1729. qlcnic_83xx_template_end(p_dev);
  1730. break;
  1731. case QLC_83XX_OPCODE_POLL_READ_LIST:
  1732. qlcnic_83xx_poll_read_list(p_dev, p_hdr);
  1733. break;
  1734. default:
  1735. dev_err(&p_dev->pdev->dev,
  1736. "%s: Unknown opcode 0x%04x in template %d\n",
  1737. __func__, p_hdr->cmd, index);
  1738. break;
  1739. }
  1740. entry += p_hdr->size;
  1741. }
  1742. p_dev->ahw->reset.seq_index = index;
  1743. }
  1744. static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev)
  1745. {
  1746. p_dev->ahw->reset.seq_index = 0;
  1747. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.stop_offset);
  1748. if (p_dev->ahw->reset.seq_end != 1)
  1749. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1750. }
  1751. static void qlcnic_83xx_start_hw(struct qlcnic_adapter *p_dev)
  1752. {
  1753. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.start_offset);
  1754. if (p_dev->ahw->reset.template_end != 1)
  1755. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1756. }
  1757. static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
  1758. {
  1759. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.init_offset);
  1760. if (p_dev->ahw->reset.seq_end != 1)
  1761. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1762. }
  1763. /* POST FW related definations*/
  1764. #define QLC_83XX_POST_SIGNATURE_REG 0x41602014
  1765. #define QLC_83XX_POST_MODE_REG 0x41602018
  1766. #define QLC_83XX_POST_FAST_MODE 0
  1767. #define QLC_83XX_POST_MEDIUM_MODE 1
  1768. #define QLC_83XX_POST_SLOW_MODE 2
  1769. /* POST Timeout values in milliseconds */
  1770. #define QLC_83XX_POST_FAST_MODE_TIMEOUT 690
  1771. #define QLC_83XX_POST_MED_MODE_TIMEOUT 2930
  1772. #define QLC_83XX_POST_SLOW_MODE_TIMEOUT 7500
  1773. /* POST result values */
  1774. #define QLC_83XX_POST_PASS 0xfffffff0
  1775. #define QLC_83XX_POST_ASIC_STRESS_TEST_FAIL 0xffffffff
  1776. #define QLC_83XX_POST_DDR_TEST_FAIL 0xfffffffe
  1777. #define QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL 0xfffffffc
  1778. #define QLC_83XX_POST_FLASH_TEST_FAIL 0xfffffff8
  1779. static int qlcnic_83xx_run_post(struct qlcnic_adapter *adapter)
  1780. {
  1781. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1782. struct device *dev = &adapter->pdev->dev;
  1783. int timeout, count, ret = 0;
  1784. u32 signature;
  1785. /* Set timeout values with extra 2 seconds of buffer */
  1786. switch (adapter->ahw->post_mode) {
  1787. case QLC_83XX_POST_FAST_MODE:
  1788. timeout = QLC_83XX_POST_FAST_MODE_TIMEOUT + 2000;
  1789. break;
  1790. case QLC_83XX_POST_MEDIUM_MODE:
  1791. timeout = QLC_83XX_POST_MED_MODE_TIMEOUT + 2000;
  1792. break;
  1793. case QLC_83XX_POST_SLOW_MODE:
  1794. timeout = QLC_83XX_POST_SLOW_MODE_TIMEOUT + 2000;
  1795. break;
  1796. default:
  1797. return -EINVAL;
  1798. }
  1799. strncpy(fw_info->fw_file_name, QLC_83XX_POST_FW_FILE_NAME,
  1800. QLC_FW_FILE_NAME_LEN);
  1801. ret = reject_firmware(&fw_info->fw, fw_info->fw_file_name, dev);
  1802. if (ret) {
  1803. dev_err(dev, "POST firmware can not be loaded, skipping POST\n");
  1804. return 0;
  1805. }
  1806. ret = qlcnic_83xx_copy_fw_file(adapter);
  1807. if (ret)
  1808. return ret;
  1809. /* clear QLC_83XX_POST_SIGNATURE_REG register */
  1810. qlcnic_ind_wr(adapter, QLC_83XX_POST_SIGNATURE_REG, 0);
  1811. /* Set POST mode */
  1812. qlcnic_ind_wr(adapter, QLC_83XX_POST_MODE_REG,
  1813. adapter->ahw->post_mode);
  1814. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1815. QLC_83XX_BOOT_FROM_FILE);
  1816. qlcnic_83xx_start_hw(adapter);
  1817. count = 0;
  1818. do {
  1819. msleep(100);
  1820. count += 100;
  1821. signature = qlcnic_ind_rd(adapter, QLC_83XX_POST_SIGNATURE_REG);
  1822. if (signature == QLC_83XX_POST_PASS)
  1823. break;
  1824. } while (timeout > count);
  1825. if (timeout <= count) {
  1826. dev_err(dev, "POST timed out, signature = 0x%08x\n", signature);
  1827. return -EIO;
  1828. }
  1829. switch (signature) {
  1830. case QLC_83XX_POST_PASS:
  1831. dev_info(dev, "POST passed, Signature = 0x%08x\n", signature);
  1832. break;
  1833. case QLC_83XX_POST_ASIC_STRESS_TEST_FAIL:
  1834. dev_err(dev, "POST failed, Test case : ASIC STRESS TEST, Signature = 0x%08x\n",
  1835. signature);
  1836. ret = -EIO;
  1837. break;
  1838. case QLC_83XX_POST_DDR_TEST_FAIL:
  1839. dev_err(dev, "POST failed, Test case : DDT TEST, Signature = 0x%08x\n",
  1840. signature);
  1841. ret = -EIO;
  1842. break;
  1843. case QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL:
  1844. dev_err(dev, "POST failed, Test case : ASIC MEMORY TEST, Signature = 0x%08x\n",
  1845. signature);
  1846. ret = -EIO;
  1847. break;
  1848. case QLC_83XX_POST_FLASH_TEST_FAIL:
  1849. dev_err(dev, "POST failed, Test case : FLASH TEST, Signature = 0x%08x\n",
  1850. signature);
  1851. ret = -EIO;
  1852. break;
  1853. default:
  1854. dev_err(dev, "POST failed, Test case : INVALID, Signature = 0x%08x\n",
  1855. signature);
  1856. ret = -EIO;
  1857. break;
  1858. }
  1859. return ret;
  1860. }
  1861. static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
  1862. {
  1863. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1864. int err = -EIO;
  1865. if (reject_firmware(&fw_info->fw, fw_info->fw_file_name,
  1866. &(adapter->pdev->dev))) {
  1867. dev_err(&adapter->pdev->dev,
  1868. "No file FW image, loading flash FW image.\n");
  1869. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1870. QLC_83XX_BOOT_FROM_FLASH);
  1871. } else {
  1872. if (qlcnic_83xx_copy_fw_file(adapter))
  1873. return err;
  1874. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1875. QLC_83XX_BOOT_FROM_FILE);
  1876. }
  1877. return 0;
  1878. }
  1879. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
  1880. {
  1881. u32 val;
  1882. int err = -EIO;
  1883. qlcnic_83xx_stop_hw(adapter);
  1884. /* Collect FW register dump if required */
  1885. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1886. if (!(val & QLC_83XX_IDC_GRACEFULL_RESET))
  1887. qlcnic_dump_fw(adapter);
  1888. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1889. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1890. __func__);
  1891. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  1892. return err;
  1893. }
  1894. qlcnic_83xx_init_hw(adapter);
  1895. if (qlcnic_83xx_copy_bootloader(adapter))
  1896. return err;
  1897. /* Check if POST needs to be run */
  1898. if (adapter->ahw->run_post) {
  1899. err = qlcnic_83xx_run_post(adapter);
  1900. if (err)
  1901. return err;
  1902. /* No need to run POST in next reset sequence */
  1903. adapter->ahw->run_post = false;
  1904. /* Again reset the adapter to load regular firmware */
  1905. qlcnic_83xx_stop_hw(adapter);
  1906. qlcnic_83xx_init_hw(adapter);
  1907. err = qlcnic_83xx_copy_bootloader(adapter);
  1908. if (err)
  1909. return err;
  1910. }
  1911. /* Boot either flash image or firmware image from host file system */
  1912. if (qlcnic_load_fw_file == 1) {
  1913. if (qlcnic_83xx_load_fw_image_from_host(adapter))
  1914. return err;
  1915. } else {
  1916. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1917. QLC_83XX_BOOT_FROM_FLASH);
  1918. }
  1919. qlcnic_83xx_start_hw(adapter);
  1920. if (qlcnic_83xx_check_hw_status(adapter))
  1921. return -EIO;
  1922. return 0;
  1923. }
  1924. static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
  1925. {
  1926. int err;
  1927. struct qlcnic_info nic_info;
  1928. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1929. memset(&nic_info, 0, sizeof(struct qlcnic_info));
  1930. err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func);
  1931. if (err)
  1932. return -EIO;
  1933. ahw->physical_port = (u8) nic_info.phys_port;
  1934. ahw->switch_mode = nic_info.switch_mode;
  1935. ahw->max_tx_ques = nic_info.max_tx_ques;
  1936. ahw->max_rx_ques = nic_info.max_rx_ques;
  1937. ahw->capabilities = nic_info.capabilities;
  1938. ahw->max_mac_filters = nic_info.max_mac_filters;
  1939. ahw->max_mtu = nic_info.max_mtu;
  1940. /* eSwitch capability indicates vNIC mode.
  1941. * vNIC and SRIOV are mutually exclusive operational modes.
  1942. * If SR-IOV capability is detected, SR-IOV physical function
  1943. * will get initialized in default mode.
  1944. * SR-IOV virtual function initialization follows a
  1945. * different code path and opmode.
  1946. * SRIOV mode has precedence over vNIC mode.
  1947. */
  1948. if (test_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state))
  1949. return QLC_83XX_DEFAULT_OPMODE;
  1950. if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY)
  1951. return QLCNIC_VNIC_MODE;
  1952. return QLC_83XX_DEFAULT_OPMODE;
  1953. }
  1954. int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
  1955. {
  1956. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1957. u16 max_sds_rings, max_tx_rings;
  1958. int ret;
  1959. ret = qlcnic_83xx_get_nic_configuration(adapter);
  1960. if (ret == -EIO)
  1961. return -EIO;
  1962. if (ret == QLCNIC_VNIC_MODE) {
  1963. ahw->nic_mode = QLCNIC_VNIC_MODE;
  1964. if (qlcnic_83xx_config_vnic_opmode(adapter))
  1965. return -EIO;
  1966. max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
  1967. max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
  1968. } else if (ret == QLC_83XX_DEFAULT_OPMODE) {
  1969. ahw->nic_mode = QLCNIC_DEFAULT_MODE;
  1970. adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
  1971. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  1972. max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  1973. max_tx_rings = QLCNIC_MAX_TX_RINGS;
  1974. } else {
  1975. dev_err(&adapter->pdev->dev, "%s: Invalid opmode %d\n",
  1976. __func__, ret);
  1977. return -EIO;
  1978. }
  1979. adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
  1980. adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
  1981. return 0;
  1982. }
  1983. static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter)
  1984. {
  1985. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1986. if (ahw->port_type == QLCNIC_XGBE) {
  1987. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
  1988. adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
  1989. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1990. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1991. } else if (ahw->port_type == QLCNIC_GBE) {
  1992. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
  1993. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1994. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1995. adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
  1996. }
  1997. adapter->num_txd = MAX_CMD_DESCRIPTORS;
  1998. adapter->max_rds_rings = MAX_RDS_RINGS;
  1999. }
  2000. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter)
  2001. {
  2002. int err = -EIO;
  2003. qlcnic_83xx_get_minidump_template(adapter);
  2004. if (qlcnic_83xx_get_port_info(adapter))
  2005. return err;
  2006. qlcnic_83xx_config_buff_descriptors(adapter);
  2007. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  2008. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  2009. dev_info(&adapter->pdev->dev, "HAL Version: %d\n",
  2010. adapter->ahw->fw_hal_version);
  2011. return 0;
  2012. }
  2013. #define IS_QLC_83XX_USED(a, b, c) (((1 << a->portnum) & b) || ((c >> 6) & 0x1))
  2014. static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
  2015. {
  2016. struct qlcnic_cmd_args cmd;
  2017. u32 presence_mask, audit_mask;
  2018. int status;
  2019. presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  2020. audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  2021. if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
  2022. status = qlcnic_alloc_mbx_args(&cmd, adapter,
  2023. QLCNIC_CMD_STOP_NIC_FUNC);
  2024. if (status)
  2025. return;
  2026. cmd.req.arg[1] = BIT_31;
  2027. status = qlcnic_issue_cmd(adapter, &cmd);
  2028. if (status)
  2029. dev_err(&adapter->pdev->dev,
  2030. "Failed to clean up the function resources\n");
  2031. qlcnic_free_mbx_args(&cmd);
  2032. }
  2033. }
  2034. static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
  2035. {
  2036. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2037. struct pci_dev *pdev = adapter->pdev;
  2038. struct qlc_83xx_fw_info *fw_info;
  2039. int err = 0;
  2040. ahw->fw_info = kzalloc(sizeof(*fw_info), GFP_KERNEL);
  2041. if (!ahw->fw_info) {
  2042. err = -ENOMEM;
  2043. } else {
  2044. fw_info = ahw->fw_info;
  2045. switch (pdev->device) {
  2046. case PCI_DEVICE_ID_QLOGIC_QLE834X:
  2047. case PCI_DEVICE_ID_QLOGIC_QLE8830:
  2048. strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
  2049. QLC_FW_FILE_NAME_LEN);
  2050. break;
  2051. case PCI_DEVICE_ID_QLOGIC_QLE844X:
  2052. strncpy(fw_info->fw_file_name, QLC_84XX_FW_FILE_NAME,
  2053. QLC_FW_FILE_NAME_LEN);
  2054. break;
  2055. default:
  2056. dev_err(&pdev->dev, "%s: Invalid device id\n",
  2057. __func__);
  2058. err = -EINVAL;
  2059. break;
  2060. }
  2061. }
  2062. return err;
  2063. }
  2064. static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter)
  2065. {
  2066. u8 rx_cnt = QLCNIC_DEF_SDS_RINGS;
  2067. u8 tx_cnt = QLCNIC_DEF_TX_RINGS;
  2068. adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
  2069. adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  2070. if (!adapter->ahw->msix_supported) {
  2071. rx_cnt = QLCNIC_SINGLE_RING;
  2072. tx_cnt = QLCNIC_SINGLE_RING;
  2073. }
  2074. /* compute and set drv sds rings */
  2075. qlcnic_set_tx_ring_count(adapter, tx_cnt);
  2076. qlcnic_set_sds_ring_count(adapter, rx_cnt);
  2077. }
  2078. int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
  2079. {
  2080. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2081. int err = 0;
  2082. adapter->rx_mac_learn = false;
  2083. ahw->msix_supported = !!qlcnic_use_msi_x;
  2084. /* Check if POST needs to be run */
  2085. switch (qlcnic_load_fw_file) {
  2086. case 2:
  2087. ahw->post_mode = QLC_83XX_POST_FAST_MODE;
  2088. ahw->run_post = true;
  2089. break;
  2090. case 3:
  2091. ahw->post_mode = QLC_83XX_POST_MEDIUM_MODE;
  2092. ahw->run_post = true;
  2093. break;
  2094. case 4:
  2095. ahw->post_mode = QLC_83XX_POST_SLOW_MODE;
  2096. ahw->run_post = true;
  2097. break;
  2098. default:
  2099. ahw->run_post = false;
  2100. break;
  2101. }
  2102. qlcnic_83xx_init_rings(adapter);
  2103. err = qlcnic_83xx_init_mailbox_work(adapter);
  2104. if (err)
  2105. goto exit;
  2106. if (qlcnic_sriov_vf_check(adapter)) {
  2107. err = qlcnic_sriov_vf_init(adapter, pci_using_dac);
  2108. if (err)
  2109. goto detach_mbx;
  2110. else
  2111. return err;
  2112. }
  2113. if (qlcnic_83xx_read_flash_descriptor_table(adapter) ||
  2114. qlcnic_83xx_read_flash_mfg_id(adapter)) {
  2115. dev_err(&adapter->pdev->dev, "Failed reading flash mfg id\n");
  2116. err = -ENOTRECOVERABLE;
  2117. goto detach_mbx;
  2118. }
  2119. err = qlcnic_83xx_check_hw_status(adapter);
  2120. if (err)
  2121. goto detach_mbx;
  2122. err = qlcnic_83xx_get_fw_info(adapter);
  2123. if (err)
  2124. goto detach_mbx;
  2125. err = qlcnic_83xx_idc_init(adapter);
  2126. if (err)
  2127. goto detach_mbx;
  2128. err = qlcnic_setup_intr(adapter);
  2129. if (err) {
  2130. dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
  2131. goto disable_intr;
  2132. }
  2133. INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
  2134. err = qlcnic_83xx_setup_mbx_intr(adapter);
  2135. if (err)
  2136. goto disable_mbx_intr;
  2137. qlcnic_83xx_clear_function_resources(adapter);
  2138. qlcnic_dcb_enable(adapter->dcb);
  2139. qlcnic_83xx_initialize_nic(adapter, 1);
  2140. qlcnic_dcb_get_info(adapter->dcb);
  2141. /* Configure default, SR-IOV or Virtual NIC mode of operation */
  2142. err = qlcnic_83xx_configure_opmode(adapter);
  2143. if (err)
  2144. goto disable_mbx_intr;
  2145. /* Perform operating mode specific initialization */
  2146. err = adapter->nic_ops->init_driver(adapter);
  2147. if (err)
  2148. goto disable_mbx_intr;
  2149. /* Periodically monitor device status */
  2150. qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
  2151. return 0;
  2152. disable_mbx_intr:
  2153. qlcnic_83xx_free_mbx_intr(adapter);
  2154. disable_intr:
  2155. qlcnic_teardown_intr(adapter);
  2156. detach_mbx:
  2157. qlcnic_83xx_detach_mailbox_work(adapter);
  2158. qlcnic_83xx_free_mailbox(ahw->mailbox);
  2159. ahw->mailbox = NULL;
  2160. exit:
  2161. return err;
  2162. }
  2163. void qlcnic_83xx_aer_stop_poll_work(struct qlcnic_adapter *adapter)
  2164. {
  2165. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2166. struct qlc_83xx_idc *idc = &ahw->idc;
  2167. clear_bit(QLC_83XX_MBX_READY, &idc->status);
  2168. cancel_delayed_work_sync(&adapter->fw_work);
  2169. if (ahw->nic_mode == QLCNIC_VNIC_MODE)
  2170. qlcnic_83xx_disable_vnic_mode(adapter, 1);
  2171. qlcnic_83xx_idc_detach_driver(adapter);
  2172. qlcnic_83xx_initialize_nic(adapter, 0);
  2173. cancel_delayed_work_sync(&adapter->idc_aen_work);
  2174. }
  2175. int qlcnic_83xx_aer_reset(struct qlcnic_adapter *adapter)
  2176. {
  2177. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2178. struct qlc_83xx_idc *idc = &ahw->idc;
  2179. int ret = 0;
  2180. u32 owner;
  2181. /* Mark the previous IDC state as NEED_RESET so
  2182. * that state_entry() will perform the reattachment
  2183. * and bringup the device
  2184. */
  2185. idc->prev_state = QLC_83XX_IDC_DEV_NEED_RESET;
  2186. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2187. if (ahw->pci_func == owner) {
  2188. ret = qlcnic_83xx_restart_hw(adapter);
  2189. if (ret < 0)
  2190. return ret;
  2191. qlcnic_83xx_idc_clear_registers(adapter, 0);
  2192. }
  2193. ret = idc->state_entry(adapter);
  2194. return ret;
  2195. }
  2196. void qlcnic_83xx_aer_start_poll_work(struct qlcnic_adapter *adapter)
  2197. {
  2198. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2199. struct qlc_83xx_idc *idc = &ahw->idc;
  2200. u32 owner;
  2201. idc->prev_state = QLC_83XX_IDC_DEV_READY;
  2202. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2203. if (ahw->pci_func == owner)
  2204. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  2205. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 0);
  2206. }