qlcnic_83xx_vnic.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "qlcnic.h"
  2. #include "qlcnic_hw.h"
  3. int qlcnic_83xx_enable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
  4. {
  5. if (lock) {
  6. if (qlcnic_83xx_lock_driver(adapter))
  7. return -EBUSY;
  8. }
  9. QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_OPER);
  10. if (lock)
  11. qlcnic_83xx_unlock_driver(adapter);
  12. return 0;
  13. }
  14. int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
  15. {
  16. struct qlcnic_hardware_context *ahw = adapter->ahw;
  17. if (lock) {
  18. if (qlcnic_83xx_lock_driver(adapter))
  19. return -EBUSY;
  20. }
  21. QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_NON_OPER);
  22. ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
  23. if (lock)
  24. qlcnic_83xx_unlock_driver(adapter);
  25. return 0;
  26. }
  27. static int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter)
  28. {
  29. u8 id;
  30. int i, ret = -EBUSY;
  31. u32 data = QLCNIC_MGMT_FUNC;
  32. struct qlcnic_hardware_context *ahw = adapter->ahw;
  33. if (qlcnic_83xx_lock_driver(adapter))
  34. return ret;
  35. if (qlcnic_config_npars) {
  36. for (i = 0; i < ahw->act_pci_func; i++) {
  37. id = adapter->npars[i].pci_func;
  38. if (id == ahw->pci_func)
  39. continue;
  40. data |= qlcnic_config_npars &
  41. QLC_83XX_SET_FUNC_OPMODE(0x3, id);
  42. }
  43. } else {
  44. data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
  45. data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, ahw->pci_func)) |
  46. QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC,
  47. ahw->pci_func);
  48. }
  49. QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data);
  50. qlcnic_83xx_unlock_driver(adapter);
  51. return 0;
  52. }
  53. static void
  54. qlcnic_83xx_config_vnic_buff_descriptors(struct qlcnic_adapter *adapter)
  55. {
  56. struct qlcnic_hardware_context *ahw = adapter->ahw;
  57. if (ahw->port_type == QLCNIC_XGBE) {
  58. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF;
  59. adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF;
  60. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  61. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  62. } else if (ahw->port_type == QLCNIC_GBE) {
  63. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
  64. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  65. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  66. adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
  67. }
  68. adapter->num_txd = MAX_CMD_DESCRIPTORS;
  69. adapter->max_rds_rings = MAX_RDS_RINGS;
  70. }
  71. /**
  72. * qlcnic_83xx_init_mgmt_vnic
  73. *
  74. * @adapter: adapter structure
  75. * Management virtual NIC sets the operational mode of other vNIC's and
  76. * configures embedded switch (ESWITCH).
  77. * Returns: Success(0) or error code.
  78. *
  79. **/
  80. static int qlcnic_83xx_init_mgmt_vnic(struct qlcnic_adapter *adapter)
  81. {
  82. int err = -EIO;
  83. if (!(adapter->flags & QLCNIC_ADAPTER_INITIALIZED)) {
  84. if (qlcnic_init_pci_info(adapter))
  85. return err;
  86. if (qlcnic_83xx_set_vnic_opmode(adapter))
  87. return err;
  88. if (qlcnic_set_default_offload_settings(adapter))
  89. return err;
  90. } else {
  91. if (qlcnic_reset_npar_config(adapter))
  92. return err;
  93. }
  94. if (qlcnic_83xx_get_port_info(adapter))
  95. return err;
  96. qlcnic_83xx_config_vnic_buff_descriptors(adapter);
  97. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  98. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  99. qlcnic_83xx_enable_vnic_mode(adapter, 1);
  100. dev_info(&adapter->pdev->dev, "HAL Version: %d, Management function\n",
  101. adapter->ahw->fw_hal_version);
  102. return 0;
  103. }
  104. static int qlcnic_83xx_init_privileged_vnic(struct qlcnic_adapter *adapter)
  105. {
  106. int err = -EIO;
  107. if (qlcnic_83xx_get_port_info(adapter))
  108. return err;
  109. qlcnic_83xx_config_vnic_buff_descriptors(adapter);
  110. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  111. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  112. dev_info(&adapter->pdev->dev,
  113. "HAL Version: %d, Privileged function\n",
  114. adapter->ahw->fw_hal_version);
  115. return 0;
  116. }
  117. static int qlcnic_83xx_init_non_privileged_vnic(struct qlcnic_adapter *adapter)
  118. {
  119. int err = -EIO;
  120. qlcnic_83xx_get_fw_version(adapter);
  121. if (qlcnic_set_eswitch_port_config(adapter))
  122. return err;
  123. if (qlcnic_83xx_get_port_info(adapter))
  124. return err;
  125. qlcnic_83xx_config_vnic_buff_descriptors(adapter);
  126. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  127. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  128. dev_info(&adapter->pdev->dev, "HAL Version: %d, Virtual function\n",
  129. adapter->ahw->fw_hal_version);
  130. return 0;
  131. }
  132. /**
  133. * qlcnic_83xx_vnic_opmode
  134. *
  135. * @adapter: adapter structure
  136. * Identify virtual NIC operational modes.
  137. *
  138. * Returns: Success(0) or error code.
  139. *
  140. **/
  141. int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
  142. {
  143. u32 op_mode, priv_level;
  144. struct qlcnic_hardware_context *ahw = adapter->ahw;
  145. struct qlcnic_nic_template *nic_ops = adapter->nic_ops;
  146. qlcnic_get_func_no(adapter);
  147. op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
  148. if (op_mode == QLC_83XX_DEFAULT_OPMODE)
  149. priv_level = QLCNIC_MGMT_FUNC;
  150. else
  151. priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode,
  152. ahw->pci_func);
  153. if (priv_level == QLCNIC_NON_PRIV_FUNC) {
  154. ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
  155. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  156. nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic;
  157. } else if (priv_level == QLCNIC_PRIV_FUNC) {
  158. ahw->op_mode = QLCNIC_PRIV_FUNC;
  159. ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry;
  160. nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic;
  161. } else if (priv_level == QLCNIC_MGMT_FUNC) {
  162. ahw->op_mode = QLCNIC_MGMT_FUNC;
  163. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  164. nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic;
  165. } else {
  166. return -EIO;
  167. }
  168. if (ahw->capabilities & BIT_23)
  169. adapter->flags |= QLCNIC_ESWITCH_ENABLED;
  170. else
  171. adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
  172. adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
  173. adapter->ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO;
  174. return 0;
  175. }