qlge_mpi.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "qlge.h"
  2. static int ql_read_mbox_reg(struct ql_adapter *qdev, u32 reg, u32 *data)
  3. {
  4. int status;
  5. /* wait for reg to come ready */
  6. status = ql_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
  7. if (status)
  8. goto exit;
  9. /* set up for reg read */
  10. ql_write32(qdev, PROC_ADDR, reg | PROC_ADDR_R);
  11. /* wait for reg to come ready */
  12. status = ql_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
  13. if (status)
  14. goto exit;
  15. /* get the data */
  16. *data = ql_read32(qdev, PROC_DATA);
  17. exit:
  18. return status;
  19. }
  20. int ql_get_mb_sts(struct ql_adapter *qdev, struct mbox_params *mbcp)
  21. {
  22. int i, status;
  23. status = ql_sem_spinlock(qdev, SEM_PROC_REG_MASK);
  24. if (status)
  25. return -EBUSY;
  26. for (i = 0; i < mbcp->out_count; i++) {
  27. status =
  28. ql_read_mbox_reg(qdev, qdev->mailbox_out + i,
  29. &mbcp->mbox_out[i]);
  30. if (status) {
  31. QPRINTK(qdev, DRV, ERR, "Failed mailbox read.\n");
  32. break;
  33. }
  34. }
  35. ql_sem_unlock(qdev, SEM_PROC_REG_MASK); /* does flush too */
  36. return status;
  37. }
  38. static void ql_link_up(struct ql_adapter *qdev, struct mbox_params *mbcp)
  39. {
  40. mbcp->out_count = 2;
  41. if (ql_get_mb_sts(qdev, mbcp))
  42. goto exit;
  43. qdev->link_status = mbcp->mbox_out[1];
  44. QPRINTK(qdev, DRV, ERR, "Link Up.\n");
  45. QPRINTK(qdev, DRV, INFO, "Link Status = 0x%.08x.\n", mbcp->mbox_out[1]);
  46. if (!netif_carrier_ok(qdev->ndev)) {
  47. QPRINTK(qdev, LINK, INFO, "Link is Up.\n");
  48. netif_carrier_on(qdev->ndev);
  49. netif_wake_queue(qdev->ndev);
  50. }
  51. exit:
  52. /* Clear the MPI firmware status. */
  53. ql_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
  54. }
  55. static void ql_link_down(struct ql_adapter *qdev, struct mbox_params *mbcp)
  56. {
  57. mbcp->out_count = 3;
  58. if (ql_get_mb_sts(qdev, mbcp)) {
  59. QPRINTK(qdev, DRV, ERR, "Firmware did not initialize!\n");
  60. goto exit;
  61. }
  62. if (netif_carrier_ok(qdev->ndev)) {
  63. QPRINTK(qdev, LINK, INFO, "Link is Down.\n");
  64. netif_carrier_off(qdev->ndev);
  65. netif_stop_queue(qdev->ndev);
  66. }
  67. QPRINTK(qdev, DRV, ERR, "Link Down.\n");
  68. QPRINTK(qdev, DRV, ERR, "Link Status = 0x%.08x.\n", mbcp->mbox_out[1]);
  69. exit:
  70. /* Clear the MPI firmware status. */
  71. ql_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
  72. }
  73. static void ql_init_fw_done(struct ql_adapter *qdev, struct mbox_params *mbcp)
  74. {
  75. mbcp->out_count = 2;
  76. if (ql_get_mb_sts(qdev, mbcp)) {
  77. QPRINTK(qdev, DRV, ERR, "Firmware did not initialize!\n");
  78. goto exit;
  79. }
  80. QPRINTK(qdev, DRV, ERR, "Firmware initialized!\n");
  81. QPRINTK(qdev, DRV, ERR, "Firmware status = 0x%.08x.\n",
  82. mbcp->mbox_out[0]);
  83. QPRINTK(qdev, DRV, ERR, "Firmware Revision = 0x%.08x.\n",
  84. mbcp->mbox_out[1]);
  85. exit:
  86. /* Clear the MPI firmware status. */
  87. ql_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
  88. }
  89. void ql_mpi_work(struct work_struct *work)
  90. {
  91. struct ql_adapter *qdev =
  92. container_of(work, struct ql_adapter, mpi_work.work);
  93. struct mbox_params mbc;
  94. struct mbox_params *mbcp = &mbc;
  95. mbcp->out_count = 1;
  96. while (ql_read32(qdev, STS) & STS_PI) {
  97. if (ql_get_mb_sts(qdev, mbcp)) {
  98. QPRINTK(qdev, DRV, ERR,
  99. "Could not read MPI, resetting ASIC!\n");
  100. ql_queue_asic_error(qdev);
  101. }
  102. switch (mbcp->mbox_out[0]) {
  103. case AEN_LINK_UP:
  104. ql_link_up(qdev, mbcp);
  105. break;
  106. case AEN_LINK_DOWN:
  107. ql_link_down(qdev, mbcp);
  108. break;
  109. case AEN_FW_INIT_DONE:
  110. ql_init_fw_done(qdev, mbcp);
  111. break;
  112. case MB_CMD_STS_GOOD:
  113. break;
  114. case AEN_FW_INIT_FAIL:
  115. case AEN_SYS_ERR:
  116. case MB_CMD_STS_ERR:
  117. ql_queue_fw_error(qdev);
  118. default:
  119. /* Clear the MPI firmware status. */
  120. ql_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
  121. break;
  122. }
  123. }
  124. ql_enable_completion_interrupt(qdev, 0);
  125. }
  126. void ql_mpi_reset_work(struct work_struct *work)
  127. {
  128. struct ql_adapter *qdev =
  129. container_of(work, struct ql_adapter, mpi_reset_work.work);
  130. QPRINTK(qdev, DRV, ERR,
  131. "Enter, qdev = %p..\n", qdev);
  132. ql_write32(qdev, CSR, CSR_CMD_SET_RST);
  133. msleep(50);
  134. ql_write32(qdev, CSR, CSR_CMD_CLR_RST);
  135. }