/drivers/net/ethernet/micrel/ksz884x.c

http://github.com/mirrors/linux · C · 7258 lines · 4600 code · 1016 blank · 1642 comment · 551 complexity · 7327a5821464bade45f1b97a615821cb MD5 · raw file

Large files are truncated click here to view the full file

  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /**
  3. * drivers/net/ethernet/micrel/ksx884x.c - Micrel KSZ8841/2 PCI Ethernet driver
  4. *
  5. * Copyright (c) 2009-2010 Micrel, Inc.
  6. * Tristram Ha <Tristram.Ha@micrel.com>
  7. */
  8. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  9. #include <linux/init.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/ioport.h>
  14. #include <linux/pci.h>
  15. #include <linux/proc_fs.h>
  16. #include <linux/mii.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/ethtool.h>
  19. #include <linux/etherdevice.h>
  20. #include <linux/in.h>
  21. #include <linux/ip.h>
  22. #include <linux/if_vlan.h>
  23. #include <linux/crc32.h>
  24. #include <linux/sched.h>
  25. #include <linux/slab.h>
  26. /* DMA Registers */
  27. #define KS_DMA_TX_CTRL 0x0000
  28. #define DMA_TX_ENABLE 0x00000001
  29. #define DMA_TX_CRC_ENABLE 0x00000002
  30. #define DMA_TX_PAD_ENABLE 0x00000004
  31. #define DMA_TX_LOOPBACK 0x00000100
  32. #define DMA_TX_FLOW_ENABLE 0x00000200
  33. #define DMA_TX_CSUM_IP 0x00010000
  34. #define DMA_TX_CSUM_TCP 0x00020000
  35. #define DMA_TX_CSUM_UDP 0x00040000
  36. #define DMA_TX_BURST_SIZE 0x3F000000
  37. #define KS_DMA_RX_CTRL 0x0004
  38. #define DMA_RX_ENABLE 0x00000001
  39. #define KS884X_DMA_RX_MULTICAST 0x00000002
  40. #define DMA_RX_PROMISCUOUS 0x00000004
  41. #define DMA_RX_ERROR 0x00000008
  42. #define DMA_RX_UNICAST 0x00000010
  43. #define DMA_RX_ALL_MULTICAST 0x00000020
  44. #define DMA_RX_BROADCAST 0x00000040
  45. #define DMA_RX_FLOW_ENABLE 0x00000200
  46. #define DMA_RX_CSUM_IP 0x00010000
  47. #define DMA_RX_CSUM_TCP 0x00020000
  48. #define DMA_RX_CSUM_UDP 0x00040000
  49. #define DMA_RX_BURST_SIZE 0x3F000000
  50. #define DMA_BURST_SHIFT 24
  51. #define DMA_BURST_DEFAULT 8
  52. #define KS_DMA_TX_START 0x0008
  53. #define KS_DMA_RX_START 0x000C
  54. #define DMA_START 0x00000001
  55. #define KS_DMA_TX_ADDR 0x0010
  56. #define KS_DMA_RX_ADDR 0x0014
  57. #define DMA_ADDR_LIST_MASK 0xFFFFFFFC
  58. #define DMA_ADDR_LIST_SHIFT 2
  59. /* MTR0 */
  60. #define KS884X_MULTICAST_0_OFFSET 0x0020
  61. #define KS884X_MULTICAST_1_OFFSET 0x0021
  62. #define KS884X_MULTICAST_2_OFFSET 0x0022
  63. #define KS884x_MULTICAST_3_OFFSET 0x0023
  64. /* MTR1 */
  65. #define KS884X_MULTICAST_4_OFFSET 0x0024
  66. #define KS884X_MULTICAST_5_OFFSET 0x0025
  67. #define KS884X_MULTICAST_6_OFFSET 0x0026
  68. #define KS884X_MULTICAST_7_OFFSET 0x0027
  69. /* Interrupt Registers */
  70. /* INTEN */
  71. #define KS884X_INTERRUPTS_ENABLE 0x0028
  72. /* INTST */
  73. #define KS884X_INTERRUPTS_STATUS 0x002C
  74. #define KS884X_INT_RX_STOPPED 0x02000000
  75. #define KS884X_INT_TX_STOPPED 0x04000000
  76. #define KS884X_INT_RX_OVERRUN 0x08000000
  77. #define KS884X_INT_TX_EMPTY 0x10000000
  78. #define KS884X_INT_RX 0x20000000
  79. #define KS884X_INT_TX 0x40000000
  80. #define KS884X_INT_PHY 0x80000000
  81. #define KS884X_INT_RX_MASK \
  82. (KS884X_INT_RX | KS884X_INT_RX_OVERRUN)
  83. #define KS884X_INT_TX_MASK \
  84. (KS884X_INT_TX | KS884X_INT_TX_EMPTY)
  85. #define KS884X_INT_MASK (KS884X_INT_RX | KS884X_INT_TX | KS884X_INT_PHY)
  86. /* MAC Additional Station Address */
  87. /* MAAL0 */
  88. #define KS_ADD_ADDR_0_LO 0x0080
  89. /* MAAH0 */
  90. #define KS_ADD_ADDR_0_HI 0x0084
  91. /* MAAL1 */
  92. #define KS_ADD_ADDR_1_LO 0x0088
  93. /* MAAH1 */
  94. #define KS_ADD_ADDR_1_HI 0x008C
  95. /* MAAL2 */
  96. #define KS_ADD_ADDR_2_LO 0x0090
  97. /* MAAH2 */
  98. #define KS_ADD_ADDR_2_HI 0x0094
  99. /* MAAL3 */
  100. #define KS_ADD_ADDR_3_LO 0x0098
  101. /* MAAH3 */
  102. #define KS_ADD_ADDR_3_HI 0x009C
  103. /* MAAL4 */
  104. #define KS_ADD_ADDR_4_LO 0x00A0
  105. /* MAAH4 */
  106. #define KS_ADD_ADDR_4_HI 0x00A4
  107. /* MAAL5 */
  108. #define KS_ADD_ADDR_5_LO 0x00A8
  109. /* MAAH5 */
  110. #define KS_ADD_ADDR_5_HI 0x00AC
  111. /* MAAL6 */
  112. #define KS_ADD_ADDR_6_LO 0x00B0
  113. /* MAAH6 */
  114. #define KS_ADD_ADDR_6_HI 0x00B4
  115. /* MAAL7 */
  116. #define KS_ADD_ADDR_7_LO 0x00B8
  117. /* MAAH7 */
  118. #define KS_ADD_ADDR_7_HI 0x00BC
  119. /* MAAL8 */
  120. #define KS_ADD_ADDR_8_LO 0x00C0
  121. /* MAAH8 */
  122. #define KS_ADD_ADDR_8_HI 0x00C4
  123. /* MAAL9 */
  124. #define KS_ADD_ADDR_9_LO 0x00C8
  125. /* MAAH9 */
  126. #define KS_ADD_ADDR_9_HI 0x00CC
  127. /* MAAL10 */
  128. #define KS_ADD_ADDR_A_LO 0x00D0
  129. /* MAAH10 */
  130. #define KS_ADD_ADDR_A_HI 0x00D4
  131. /* MAAL11 */
  132. #define KS_ADD_ADDR_B_LO 0x00D8
  133. /* MAAH11 */
  134. #define KS_ADD_ADDR_B_HI 0x00DC
  135. /* MAAL12 */
  136. #define KS_ADD_ADDR_C_LO 0x00E0
  137. /* MAAH12 */
  138. #define KS_ADD_ADDR_C_HI 0x00E4
  139. /* MAAL13 */
  140. #define KS_ADD_ADDR_D_LO 0x00E8
  141. /* MAAH13 */
  142. #define KS_ADD_ADDR_D_HI 0x00EC
  143. /* MAAL14 */
  144. #define KS_ADD_ADDR_E_LO 0x00F0
  145. /* MAAH14 */
  146. #define KS_ADD_ADDR_E_HI 0x00F4
  147. /* MAAL15 */
  148. #define KS_ADD_ADDR_F_LO 0x00F8
  149. /* MAAH15 */
  150. #define KS_ADD_ADDR_F_HI 0x00FC
  151. #define ADD_ADDR_HI_MASK 0x0000FFFF
  152. #define ADD_ADDR_ENABLE 0x80000000
  153. #define ADD_ADDR_INCR 8
  154. /* Miscellaneous Registers */
  155. /* MARL */
  156. #define KS884X_ADDR_0_OFFSET 0x0200
  157. #define KS884X_ADDR_1_OFFSET 0x0201
  158. /* MARM */
  159. #define KS884X_ADDR_2_OFFSET 0x0202
  160. #define KS884X_ADDR_3_OFFSET 0x0203
  161. /* MARH */
  162. #define KS884X_ADDR_4_OFFSET 0x0204
  163. #define KS884X_ADDR_5_OFFSET 0x0205
  164. /* OBCR */
  165. #define KS884X_BUS_CTRL_OFFSET 0x0210
  166. #define BUS_SPEED_125_MHZ 0x0000
  167. #define BUS_SPEED_62_5_MHZ 0x0001
  168. #define BUS_SPEED_41_66_MHZ 0x0002
  169. #define BUS_SPEED_25_MHZ 0x0003
  170. /* EEPCR */
  171. #define KS884X_EEPROM_CTRL_OFFSET 0x0212
  172. #define EEPROM_CHIP_SELECT 0x0001
  173. #define EEPROM_SERIAL_CLOCK 0x0002
  174. #define EEPROM_DATA_OUT 0x0004
  175. #define EEPROM_DATA_IN 0x0008
  176. #define EEPROM_ACCESS_ENABLE 0x0010
  177. /* MBIR */
  178. #define KS884X_MEM_INFO_OFFSET 0x0214
  179. #define RX_MEM_TEST_FAILED 0x0008
  180. #define RX_MEM_TEST_FINISHED 0x0010
  181. #define TX_MEM_TEST_FAILED 0x0800
  182. #define TX_MEM_TEST_FINISHED 0x1000
  183. /* GCR */
  184. #define KS884X_GLOBAL_CTRL_OFFSET 0x0216
  185. #define GLOBAL_SOFTWARE_RESET 0x0001
  186. #define KS8841_POWER_MANAGE_OFFSET 0x0218
  187. /* WFCR */
  188. #define KS8841_WOL_CTRL_OFFSET 0x021A
  189. #define KS8841_WOL_MAGIC_ENABLE 0x0080
  190. #define KS8841_WOL_FRAME3_ENABLE 0x0008
  191. #define KS8841_WOL_FRAME2_ENABLE 0x0004
  192. #define KS8841_WOL_FRAME1_ENABLE 0x0002
  193. #define KS8841_WOL_FRAME0_ENABLE 0x0001
  194. /* WF0 */
  195. #define KS8841_WOL_FRAME_CRC_OFFSET 0x0220
  196. #define KS8841_WOL_FRAME_BYTE0_OFFSET 0x0224
  197. #define KS8841_WOL_FRAME_BYTE2_OFFSET 0x0228
  198. /* IACR */
  199. #define KS884X_IACR_P 0x04A0
  200. #define KS884X_IACR_OFFSET KS884X_IACR_P
  201. /* IADR1 */
  202. #define KS884X_IADR1_P 0x04A2
  203. #define KS884X_IADR2_P 0x04A4
  204. #define KS884X_IADR3_P 0x04A6
  205. #define KS884X_IADR4_P 0x04A8
  206. #define KS884X_IADR5_P 0x04AA
  207. #define KS884X_ACC_CTRL_SEL_OFFSET KS884X_IACR_P
  208. #define KS884X_ACC_CTRL_INDEX_OFFSET (KS884X_ACC_CTRL_SEL_OFFSET + 1)
  209. #define KS884X_ACC_DATA_0_OFFSET KS884X_IADR4_P
  210. #define KS884X_ACC_DATA_1_OFFSET (KS884X_ACC_DATA_0_OFFSET + 1)
  211. #define KS884X_ACC_DATA_2_OFFSET KS884X_IADR5_P
  212. #define KS884X_ACC_DATA_3_OFFSET (KS884X_ACC_DATA_2_OFFSET + 1)
  213. #define KS884X_ACC_DATA_4_OFFSET KS884X_IADR2_P
  214. #define KS884X_ACC_DATA_5_OFFSET (KS884X_ACC_DATA_4_OFFSET + 1)
  215. #define KS884X_ACC_DATA_6_OFFSET KS884X_IADR3_P
  216. #define KS884X_ACC_DATA_7_OFFSET (KS884X_ACC_DATA_6_OFFSET + 1)
  217. #define KS884X_ACC_DATA_8_OFFSET KS884X_IADR1_P
  218. /* P1MBCR */
  219. #define KS884X_P1MBCR_P 0x04D0
  220. #define KS884X_P1MBSR_P 0x04D2
  221. #define KS884X_PHY1ILR_P 0x04D4
  222. #define KS884X_PHY1IHR_P 0x04D6
  223. #define KS884X_P1ANAR_P 0x04D8
  224. #define KS884X_P1ANLPR_P 0x04DA
  225. /* P2MBCR */
  226. #define KS884X_P2MBCR_P 0x04E0
  227. #define KS884X_P2MBSR_P 0x04E2
  228. #define KS884X_PHY2ILR_P 0x04E4
  229. #define KS884X_PHY2IHR_P 0x04E6
  230. #define KS884X_P2ANAR_P 0x04E8
  231. #define KS884X_P2ANLPR_P 0x04EA
  232. #define KS884X_PHY_1_CTRL_OFFSET KS884X_P1MBCR_P
  233. #define PHY_CTRL_INTERVAL (KS884X_P2MBCR_P - KS884X_P1MBCR_P)
  234. #define KS884X_PHY_CTRL_OFFSET 0x00
  235. /* Mode Control Register */
  236. #define PHY_REG_CTRL 0
  237. #define PHY_RESET 0x8000
  238. #define PHY_LOOPBACK 0x4000
  239. #define PHY_SPEED_100MBIT 0x2000
  240. #define PHY_AUTO_NEG_ENABLE 0x1000
  241. #define PHY_POWER_DOWN 0x0800
  242. #define PHY_MII_DISABLE 0x0400
  243. #define PHY_AUTO_NEG_RESTART 0x0200
  244. #define PHY_FULL_DUPLEX 0x0100
  245. #define PHY_COLLISION_TEST 0x0080
  246. #define PHY_HP_MDIX 0x0020
  247. #define PHY_FORCE_MDIX 0x0010
  248. #define PHY_AUTO_MDIX_DISABLE 0x0008
  249. #define PHY_REMOTE_FAULT_DISABLE 0x0004
  250. #define PHY_TRANSMIT_DISABLE 0x0002
  251. #define PHY_LED_DISABLE 0x0001
  252. #define KS884X_PHY_STATUS_OFFSET 0x02
  253. /* Mode Status Register */
  254. #define PHY_REG_STATUS 1
  255. #define PHY_100BT4_CAPABLE 0x8000
  256. #define PHY_100BTX_FD_CAPABLE 0x4000
  257. #define PHY_100BTX_CAPABLE 0x2000
  258. #define PHY_10BT_FD_CAPABLE 0x1000
  259. #define PHY_10BT_CAPABLE 0x0800
  260. #define PHY_MII_SUPPRESS_CAPABLE 0x0040
  261. #define PHY_AUTO_NEG_ACKNOWLEDGE 0x0020
  262. #define PHY_REMOTE_FAULT 0x0010
  263. #define PHY_AUTO_NEG_CAPABLE 0x0008
  264. #define PHY_LINK_STATUS 0x0004
  265. #define PHY_JABBER_DETECT 0x0002
  266. #define PHY_EXTENDED_CAPABILITY 0x0001
  267. #define KS884X_PHY_ID_1_OFFSET 0x04
  268. #define KS884X_PHY_ID_2_OFFSET 0x06
  269. /* PHY Identifier Registers */
  270. #define PHY_REG_ID_1 2
  271. #define PHY_REG_ID_2 3
  272. #define KS884X_PHY_AUTO_NEG_OFFSET 0x08
  273. /* Auto-Negotiation Advertisement Register */
  274. #define PHY_REG_AUTO_NEGOTIATION 4
  275. #define PHY_AUTO_NEG_NEXT_PAGE 0x8000
  276. #define PHY_AUTO_NEG_REMOTE_FAULT 0x2000
  277. /* Not supported. */
  278. #define PHY_AUTO_NEG_ASYM_PAUSE 0x0800
  279. #define PHY_AUTO_NEG_SYM_PAUSE 0x0400
  280. #define PHY_AUTO_NEG_100BT4 0x0200
  281. #define PHY_AUTO_NEG_100BTX_FD 0x0100
  282. #define PHY_AUTO_NEG_100BTX 0x0080
  283. #define PHY_AUTO_NEG_10BT_FD 0x0040
  284. #define PHY_AUTO_NEG_10BT 0x0020
  285. #define PHY_AUTO_NEG_SELECTOR 0x001F
  286. #define PHY_AUTO_NEG_802_3 0x0001
  287. #define PHY_AUTO_NEG_PAUSE (PHY_AUTO_NEG_SYM_PAUSE | PHY_AUTO_NEG_ASYM_PAUSE)
  288. #define KS884X_PHY_REMOTE_CAP_OFFSET 0x0A
  289. /* Auto-Negotiation Link Partner Ability Register */
  290. #define PHY_REG_REMOTE_CAPABILITY 5
  291. #define PHY_REMOTE_NEXT_PAGE 0x8000
  292. #define PHY_REMOTE_ACKNOWLEDGE 0x4000
  293. #define PHY_REMOTE_REMOTE_FAULT 0x2000
  294. #define PHY_REMOTE_SYM_PAUSE 0x0400
  295. #define PHY_REMOTE_100BTX_FD 0x0100
  296. #define PHY_REMOTE_100BTX 0x0080
  297. #define PHY_REMOTE_10BT_FD 0x0040
  298. #define PHY_REMOTE_10BT 0x0020
  299. /* P1VCT */
  300. #define KS884X_P1VCT_P 0x04F0
  301. #define KS884X_P1PHYCTRL_P 0x04F2
  302. /* P2VCT */
  303. #define KS884X_P2VCT_P 0x04F4
  304. #define KS884X_P2PHYCTRL_P 0x04F6
  305. #define KS884X_PHY_SPECIAL_OFFSET KS884X_P1VCT_P
  306. #define PHY_SPECIAL_INTERVAL (KS884X_P2VCT_P - KS884X_P1VCT_P)
  307. #define KS884X_PHY_LINK_MD_OFFSET 0x00
  308. #define PHY_START_CABLE_DIAG 0x8000
  309. #define PHY_CABLE_DIAG_RESULT 0x6000
  310. #define PHY_CABLE_STAT_NORMAL 0x0000
  311. #define PHY_CABLE_STAT_OPEN 0x2000
  312. #define PHY_CABLE_STAT_SHORT 0x4000
  313. #define PHY_CABLE_STAT_FAILED 0x6000
  314. #define PHY_CABLE_10M_SHORT 0x1000
  315. #define PHY_CABLE_FAULT_COUNTER 0x01FF
  316. #define KS884X_PHY_PHY_CTRL_OFFSET 0x02
  317. #define PHY_STAT_REVERSED_POLARITY 0x0020
  318. #define PHY_STAT_MDIX 0x0010
  319. #define PHY_FORCE_LINK 0x0008
  320. #define PHY_POWER_SAVING_DISABLE 0x0004
  321. #define PHY_REMOTE_LOOPBACK 0x0002
  322. /* SIDER */
  323. #define KS884X_SIDER_P 0x0400
  324. #define KS884X_CHIP_ID_OFFSET KS884X_SIDER_P
  325. #define KS884X_FAMILY_ID_OFFSET (KS884X_CHIP_ID_OFFSET + 1)
  326. #define REG_FAMILY_ID 0x88
  327. #define REG_CHIP_ID_41 0x8810
  328. #define REG_CHIP_ID_42 0x8800
  329. #define KS884X_CHIP_ID_MASK_41 0xFF10
  330. #define KS884X_CHIP_ID_MASK 0xFFF0
  331. #define KS884X_CHIP_ID_SHIFT 4
  332. #define KS884X_REVISION_MASK 0x000E
  333. #define KS884X_REVISION_SHIFT 1
  334. #define KS8842_START 0x0001
  335. #define CHIP_IP_41_M 0x8810
  336. #define CHIP_IP_42_M 0x8800
  337. #define CHIP_IP_61_M 0x8890
  338. #define CHIP_IP_62_M 0x8880
  339. #define CHIP_IP_41_P 0x8850
  340. #define CHIP_IP_42_P 0x8840
  341. #define CHIP_IP_61_P 0x88D0
  342. #define CHIP_IP_62_P 0x88C0
  343. /* SGCR1 */
  344. #define KS8842_SGCR1_P 0x0402
  345. #define KS8842_SWITCH_CTRL_1_OFFSET KS8842_SGCR1_P
  346. #define SWITCH_PASS_ALL 0x8000
  347. #define SWITCH_TX_FLOW_CTRL 0x2000
  348. #define SWITCH_RX_FLOW_CTRL 0x1000
  349. #define SWITCH_CHECK_LENGTH 0x0800
  350. #define SWITCH_AGING_ENABLE 0x0400
  351. #define SWITCH_FAST_AGING 0x0200
  352. #define SWITCH_AGGR_BACKOFF 0x0100
  353. #define SWITCH_PASS_PAUSE 0x0008
  354. #define SWITCH_LINK_AUTO_AGING 0x0001
  355. /* SGCR2 */
  356. #define KS8842_SGCR2_P 0x0404
  357. #define KS8842_SWITCH_CTRL_2_OFFSET KS8842_SGCR2_P
  358. #define SWITCH_VLAN_ENABLE 0x8000
  359. #define SWITCH_IGMP_SNOOP 0x4000
  360. #define IPV6_MLD_SNOOP_ENABLE 0x2000
  361. #define IPV6_MLD_SNOOP_OPTION 0x1000
  362. #define PRIORITY_SCHEME_SELECT 0x0800
  363. #define SWITCH_MIRROR_RX_TX 0x0100
  364. #define UNICAST_VLAN_BOUNDARY 0x0080
  365. #define MULTICAST_STORM_DISABLE 0x0040
  366. #define SWITCH_BACK_PRESSURE 0x0020
  367. #define FAIR_FLOW_CTRL 0x0010
  368. #define NO_EXC_COLLISION_DROP 0x0008
  369. #define SWITCH_HUGE_PACKET 0x0004
  370. #define SWITCH_LEGAL_PACKET 0x0002
  371. #define SWITCH_BUF_RESERVE 0x0001
  372. /* SGCR3 */
  373. #define KS8842_SGCR3_P 0x0406
  374. #define KS8842_SWITCH_CTRL_3_OFFSET KS8842_SGCR3_P
  375. #define BROADCAST_STORM_RATE_LO 0xFF00
  376. #define SWITCH_REPEATER 0x0080
  377. #define SWITCH_HALF_DUPLEX 0x0040
  378. #define SWITCH_FLOW_CTRL 0x0020
  379. #define SWITCH_10_MBIT 0x0010
  380. #define SWITCH_REPLACE_NULL_VID 0x0008
  381. #define BROADCAST_STORM_RATE_HI 0x0007
  382. #define BROADCAST_STORM_RATE 0x07FF
  383. /* SGCR4 */
  384. #define KS8842_SGCR4_P 0x0408
  385. /* SGCR5 */
  386. #define KS8842_SGCR5_P 0x040A
  387. #define KS8842_SWITCH_CTRL_5_OFFSET KS8842_SGCR5_P
  388. #define LED_MODE 0x8200
  389. #define LED_SPEED_DUPLEX_ACT 0x0000
  390. #define LED_SPEED_DUPLEX_LINK_ACT 0x8000
  391. #define LED_DUPLEX_10_100 0x0200
  392. /* SGCR6 */
  393. #define KS8842_SGCR6_P 0x0410
  394. #define KS8842_SWITCH_CTRL_6_OFFSET KS8842_SGCR6_P
  395. #define KS8842_PRIORITY_MASK 3
  396. #define KS8842_PRIORITY_SHIFT 2
  397. /* SGCR7 */
  398. #define KS8842_SGCR7_P 0x0412
  399. #define KS8842_SWITCH_CTRL_7_OFFSET KS8842_SGCR7_P
  400. #define SWITCH_UNK_DEF_PORT_ENABLE 0x0008
  401. #define SWITCH_UNK_DEF_PORT_3 0x0004
  402. #define SWITCH_UNK_DEF_PORT_2 0x0002
  403. #define SWITCH_UNK_DEF_PORT_1 0x0001
  404. /* MACAR1 */
  405. #define KS8842_MACAR1_P 0x0470
  406. #define KS8842_MACAR2_P 0x0472
  407. #define KS8842_MACAR3_P 0x0474
  408. #define KS8842_MAC_ADDR_1_OFFSET KS8842_MACAR1_P
  409. #define KS8842_MAC_ADDR_0_OFFSET (KS8842_MAC_ADDR_1_OFFSET + 1)
  410. #define KS8842_MAC_ADDR_3_OFFSET KS8842_MACAR2_P
  411. #define KS8842_MAC_ADDR_2_OFFSET (KS8842_MAC_ADDR_3_OFFSET + 1)
  412. #define KS8842_MAC_ADDR_5_OFFSET KS8842_MACAR3_P
  413. #define KS8842_MAC_ADDR_4_OFFSET (KS8842_MAC_ADDR_5_OFFSET + 1)
  414. /* TOSR1 */
  415. #define KS8842_TOSR1_P 0x0480
  416. #define KS8842_TOSR2_P 0x0482
  417. #define KS8842_TOSR3_P 0x0484
  418. #define KS8842_TOSR4_P 0x0486
  419. #define KS8842_TOSR5_P 0x0488
  420. #define KS8842_TOSR6_P 0x048A
  421. #define KS8842_TOSR7_P 0x0490
  422. #define KS8842_TOSR8_P 0x0492
  423. #define KS8842_TOS_1_OFFSET KS8842_TOSR1_P
  424. #define KS8842_TOS_2_OFFSET KS8842_TOSR2_P
  425. #define KS8842_TOS_3_OFFSET KS8842_TOSR3_P
  426. #define KS8842_TOS_4_OFFSET KS8842_TOSR4_P
  427. #define KS8842_TOS_5_OFFSET KS8842_TOSR5_P
  428. #define KS8842_TOS_6_OFFSET KS8842_TOSR6_P
  429. #define KS8842_TOS_7_OFFSET KS8842_TOSR7_P
  430. #define KS8842_TOS_8_OFFSET KS8842_TOSR8_P
  431. /* P1CR1 */
  432. #define KS8842_P1CR1_P 0x0500
  433. #define KS8842_P1CR2_P 0x0502
  434. #define KS8842_P1VIDR_P 0x0504
  435. #define KS8842_P1CR3_P 0x0506
  436. #define KS8842_P1IRCR_P 0x0508
  437. #define KS8842_P1ERCR_P 0x050A
  438. #define KS884X_P1SCSLMD_P 0x0510
  439. #define KS884X_P1CR4_P 0x0512
  440. #define KS884X_P1SR_P 0x0514
  441. /* P2CR1 */
  442. #define KS8842_P2CR1_P 0x0520
  443. #define KS8842_P2CR2_P 0x0522
  444. #define KS8842_P2VIDR_P 0x0524
  445. #define KS8842_P2CR3_P 0x0526
  446. #define KS8842_P2IRCR_P 0x0528
  447. #define KS8842_P2ERCR_P 0x052A
  448. #define KS884X_P2SCSLMD_P 0x0530
  449. #define KS884X_P2CR4_P 0x0532
  450. #define KS884X_P2SR_P 0x0534
  451. /* P3CR1 */
  452. #define KS8842_P3CR1_P 0x0540
  453. #define KS8842_P3CR2_P 0x0542
  454. #define KS8842_P3VIDR_P 0x0544
  455. #define KS8842_P3CR3_P 0x0546
  456. #define KS8842_P3IRCR_P 0x0548
  457. #define KS8842_P3ERCR_P 0x054A
  458. #define KS8842_PORT_1_CTRL_1 KS8842_P1CR1_P
  459. #define KS8842_PORT_2_CTRL_1 KS8842_P2CR1_P
  460. #define KS8842_PORT_3_CTRL_1 KS8842_P3CR1_P
  461. #define PORT_CTRL_ADDR(port, addr) \
  462. (addr = KS8842_PORT_1_CTRL_1 + (port) * \
  463. (KS8842_PORT_2_CTRL_1 - KS8842_PORT_1_CTRL_1))
  464. #define KS8842_PORT_CTRL_1_OFFSET 0x00
  465. #define PORT_BROADCAST_STORM 0x0080
  466. #define PORT_DIFFSERV_ENABLE 0x0040
  467. #define PORT_802_1P_ENABLE 0x0020
  468. #define PORT_BASED_PRIORITY_MASK 0x0018
  469. #define PORT_BASED_PRIORITY_BASE 0x0003
  470. #define PORT_BASED_PRIORITY_SHIFT 3
  471. #define PORT_BASED_PRIORITY_0 0x0000
  472. #define PORT_BASED_PRIORITY_1 0x0008
  473. #define PORT_BASED_PRIORITY_2 0x0010
  474. #define PORT_BASED_PRIORITY_3 0x0018
  475. #define PORT_INSERT_TAG 0x0004
  476. #define PORT_REMOVE_TAG 0x0002
  477. #define PORT_PRIO_QUEUE_ENABLE 0x0001
  478. #define KS8842_PORT_CTRL_2_OFFSET 0x02
  479. #define PORT_INGRESS_VLAN_FILTER 0x4000
  480. #define PORT_DISCARD_NON_VID 0x2000
  481. #define PORT_FORCE_FLOW_CTRL 0x1000
  482. #define PORT_BACK_PRESSURE 0x0800
  483. #define PORT_TX_ENABLE 0x0400
  484. #define PORT_RX_ENABLE 0x0200
  485. #define PORT_LEARN_DISABLE 0x0100
  486. #define PORT_MIRROR_SNIFFER 0x0080
  487. #define PORT_MIRROR_RX 0x0040
  488. #define PORT_MIRROR_TX 0x0020
  489. #define PORT_USER_PRIORITY_CEILING 0x0008
  490. #define PORT_VLAN_MEMBERSHIP 0x0007
  491. #define KS8842_PORT_CTRL_VID_OFFSET 0x04
  492. #define PORT_DEFAULT_VID 0x0001
  493. #define KS8842_PORT_CTRL_3_OFFSET 0x06
  494. #define PORT_INGRESS_LIMIT_MODE 0x000C
  495. #define PORT_INGRESS_ALL 0x0000
  496. #define PORT_INGRESS_UNICAST 0x0004
  497. #define PORT_INGRESS_MULTICAST 0x0008
  498. #define PORT_INGRESS_BROADCAST 0x000C
  499. #define PORT_COUNT_IFG 0x0002
  500. #define PORT_COUNT_PREAMBLE 0x0001
  501. #define KS8842_PORT_IN_RATE_OFFSET 0x08
  502. #define KS8842_PORT_OUT_RATE_OFFSET 0x0A
  503. #define PORT_PRIORITY_RATE 0x0F
  504. #define PORT_PRIORITY_RATE_SHIFT 4
  505. #define KS884X_PORT_LINK_MD 0x10
  506. #define PORT_CABLE_10M_SHORT 0x8000
  507. #define PORT_CABLE_DIAG_RESULT 0x6000
  508. #define PORT_CABLE_STAT_NORMAL 0x0000
  509. #define PORT_CABLE_STAT_OPEN 0x2000
  510. #define PORT_CABLE_STAT_SHORT 0x4000
  511. #define PORT_CABLE_STAT_FAILED 0x6000
  512. #define PORT_START_CABLE_DIAG 0x1000
  513. #define PORT_FORCE_LINK 0x0800
  514. #define PORT_POWER_SAVING_DISABLE 0x0400
  515. #define PORT_PHY_REMOTE_LOOPBACK 0x0200
  516. #define PORT_CABLE_FAULT_COUNTER 0x01FF
  517. #define KS884X_PORT_CTRL_4_OFFSET 0x12
  518. #define PORT_LED_OFF 0x8000
  519. #define PORT_TX_DISABLE 0x4000
  520. #define PORT_AUTO_NEG_RESTART 0x2000
  521. #define PORT_REMOTE_FAULT_DISABLE 0x1000
  522. #define PORT_POWER_DOWN 0x0800
  523. #define PORT_AUTO_MDIX_DISABLE 0x0400
  524. #define PORT_FORCE_MDIX 0x0200
  525. #define PORT_LOOPBACK 0x0100
  526. #define PORT_AUTO_NEG_ENABLE 0x0080
  527. #define PORT_FORCE_100_MBIT 0x0040
  528. #define PORT_FORCE_FULL_DUPLEX 0x0020
  529. #define PORT_AUTO_NEG_SYM_PAUSE 0x0010
  530. #define PORT_AUTO_NEG_100BTX_FD 0x0008
  531. #define PORT_AUTO_NEG_100BTX 0x0004
  532. #define PORT_AUTO_NEG_10BT_FD 0x0002
  533. #define PORT_AUTO_NEG_10BT 0x0001
  534. #define KS884X_PORT_STATUS_OFFSET 0x14
  535. #define PORT_HP_MDIX 0x8000
  536. #define PORT_REVERSED_POLARITY 0x2000
  537. #define PORT_RX_FLOW_CTRL 0x0800
  538. #define PORT_TX_FLOW_CTRL 0x1000
  539. #define PORT_STATUS_SPEED_100MBIT 0x0400
  540. #define PORT_STATUS_FULL_DUPLEX 0x0200
  541. #define PORT_REMOTE_FAULT 0x0100
  542. #define PORT_MDIX_STATUS 0x0080
  543. #define PORT_AUTO_NEG_COMPLETE 0x0040
  544. #define PORT_STATUS_LINK_GOOD 0x0020
  545. #define PORT_REMOTE_SYM_PAUSE 0x0010
  546. #define PORT_REMOTE_100BTX_FD 0x0008
  547. #define PORT_REMOTE_100BTX 0x0004
  548. #define PORT_REMOTE_10BT_FD 0x0002
  549. #define PORT_REMOTE_10BT 0x0001
  550. /*
  551. #define STATIC_MAC_TABLE_ADDR 00-0000FFFF-FFFFFFFF
  552. #define STATIC_MAC_TABLE_FWD_PORTS 00-00070000-00000000
  553. #define STATIC_MAC_TABLE_VALID 00-00080000-00000000
  554. #define STATIC_MAC_TABLE_OVERRIDE 00-00100000-00000000
  555. #define STATIC_MAC_TABLE_USE_FID 00-00200000-00000000
  556. #define STATIC_MAC_TABLE_FID 00-03C00000-00000000
  557. */
  558. #define STATIC_MAC_TABLE_ADDR 0x0000FFFF
  559. #define STATIC_MAC_TABLE_FWD_PORTS 0x00070000
  560. #define STATIC_MAC_TABLE_VALID 0x00080000
  561. #define STATIC_MAC_TABLE_OVERRIDE 0x00100000
  562. #define STATIC_MAC_TABLE_USE_FID 0x00200000
  563. #define STATIC_MAC_TABLE_FID 0x03C00000
  564. #define STATIC_MAC_FWD_PORTS_SHIFT 16
  565. #define STATIC_MAC_FID_SHIFT 22
  566. /*
  567. #define VLAN_TABLE_VID 00-00000000-00000FFF
  568. #define VLAN_TABLE_FID 00-00000000-0000F000
  569. #define VLAN_TABLE_MEMBERSHIP 00-00000000-00070000
  570. #define VLAN_TABLE_VALID 00-00000000-00080000
  571. */
  572. #define VLAN_TABLE_VID 0x00000FFF
  573. #define VLAN_TABLE_FID 0x0000F000
  574. #define VLAN_TABLE_MEMBERSHIP 0x00070000
  575. #define VLAN_TABLE_VALID 0x00080000
  576. #define VLAN_TABLE_FID_SHIFT 12
  577. #define VLAN_TABLE_MEMBERSHIP_SHIFT 16
  578. /*
  579. #define DYNAMIC_MAC_TABLE_ADDR 00-0000FFFF-FFFFFFFF
  580. #define DYNAMIC_MAC_TABLE_FID 00-000F0000-00000000
  581. #define DYNAMIC_MAC_TABLE_SRC_PORT 00-00300000-00000000
  582. #define DYNAMIC_MAC_TABLE_TIMESTAMP 00-00C00000-00000000
  583. #define DYNAMIC_MAC_TABLE_ENTRIES 03-FF000000-00000000
  584. #define DYNAMIC_MAC_TABLE_MAC_EMPTY 04-00000000-00000000
  585. #define DYNAMIC_MAC_TABLE_RESERVED 78-00000000-00000000
  586. #define DYNAMIC_MAC_TABLE_NOT_READY 80-00000000-00000000
  587. */
  588. #define DYNAMIC_MAC_TABLE_ADDR 0x0000FFFF
  589. #define DYNAMIC_MAC_TABLE_FID 0x000F0000
  590. #define DYNAMIC_MAC_TABLE_SRC_PORT 0x00300000
  591. #define DYNAMIC_MAC_TABLE_TIMESTAMP 0x00C00000
  592. #define DYNAMIC_MAC_TABLE_ENTRIES 0xFF000000
  593. #define DYNAMIC_MAC_TABLE_ENTRIES_H 0x03
  594. #define DYNAMIC_MAC_TABLE_MAC_EMPTY 0x04
  595. #define DYNAMIC_MAC_TABLE_RESERVED 0x78
  596. #define DYNAMIC_MAC_TABLE_NOT_READY 0x80
  597. #define DYNAMIC_MAC_FID_SHIFT 16
  598. #define DYNAMIC_MAC_SRC_PORT_SHIFT 20
  599. #define DYNAMIC_MAC_TIMESTAMP_SHIFT 22
  600. #define DYNAMIC_MAC_ENTRIES_SHIFT 24
  601. #define DYNAMIC_MAC_ENTRIES_H_SHIFT 8
  602. /*
  603. #define MIB_COUNTER_VALUE 00-00000000-3FFFFFFF
  604. #define MIB_COUNTER_VALID 00-00000000-40000000
  605. #define MIB_COUNTER_OVERFLOW 00-00000000-80000000
  606. */
  607. #define MIB_COUNTER_VALUE 0x3FFFFFFF
  608. #define MIB_COUNTER_VALID 0x40000000
  609. #define MIB_COUNTER_OVERFLOW 0x80000000
  610. #define MIB_PACKET_DROPPED 0x0000FFFF
  611. #define KS_MIB_PACKET_DROPPED_TX_0 0x100
  612. #define KS_MIB_PACKET_DROPPED_TX_1 0x101
  613. #define KS_MIB_PACKET_DROPPED_TX 0x102
  614. #define KS_MIB_PACKET_DROPPED_RX_0 0x103
  615. #define KS_MIB_PACKET_DROPPED_RX_1 0x104
  616. #define KS_MIB_PACKET_DROPPED_RX 0x105
  617. /* Change default LED mode. */
  618. #define SET_DEFAULT_LED LED_SPEED_DUPLEX_ACT
  619. #define MAC_ADDR_ORDER(i) (ETH_ALEN - 1 - (i))
  620. #define MAX_ETHERNET_BODY_SIZE 1500
  621. #define ETHERNET_HEADER_SIZE (14 + VLAN_HLEN)
  622. #define MAX_ETHERNET_PACKET_SIZE \
  623. (MAX_ETHERNET_BODY_SIZE + ETHERNET_HEADER_SIZE)
  624. #define REGULAR_RX_BUF_SIZE (MAX_ETHERNET_PACKET_SIZE + 4)
  625. #define MAX_RX_BUF_SIZE (1912 + 4)
  626. #define ADDITIONAL_ENTRIES 16
  627. #define MAX_MULTICAST_LIST 32
  628. #define HW_MULTICAST_SIZE 8
  629. #define HW_TO_DEV_PORT(port) (port - 1)
  630. enum {
  631. media_connected,
  632. media_disconnected
  633. };
  634. enum {
  635. OID_COUNTER_UNKOWN,
  636. OID_COUNTER_FIRST,
  637. /* total transmit errors */
  638. OID_COUNTER_XMIT_ERROR,
  639. /* total receive errors */
  640. OID_COUNTER_RCV_ERROR,
  641. OID_COUNTER_LAST
  642. };
  643. /*
  644. * Hardware descriptor definitions
  645. */
  646. #define DESC_ALIGNMENT 16
  647. #define BUFFER_ALIGNMENT 8
  648. #define NUM_OF_RX_DESC 64
  649. #define NUM_OF_TX_DESC 64
  650. #define KS_DESC_RX_FRAME_LEN 0x000007FF
  651. #define KS_DESC_RX_FRAME_TYPE 0x00008000
  652. #define KS_DESC_RX_ERROR_CRC 0x00010000
  653. #define KS_DESC_RX_ERROR_RUNT 0x00020000
  654. #define KS_DESC_RX_ERROR_TOO_LONG 0x00040000
  655. #define KS_DESC_RX_ERROR_PHY 0x00080000
  656. #define KS884X_DESC_RX_PORT_MASK 0x00300000
  657. #define KS_DESC_RX_MULTICAST 0x01000000
  658. #define KS_DESC_RX_ERROR 0x02000000
  659. #define KS_DESC_RX_ERROR_CSUM_UDP 0x04000000
  660. #define KS_DESC_RX_ERROR_CSUM_TCP 0x08000000
  661. #define KS_DESC_RX_ERROR_CSUM_IP 0x10000000
  662. #define KS_DESC_RX_LAST 0x20000000
  663. #define KS_DESC_RX_FIRST 0x40000000
  664. #define KS_DESC_RX_ERROR_COND \
  665. (KS_DESC_RX_ERROR_CRC | \
  666. KS_DESC_RX_ERROR_RUNT | \
  667. KS_DESC_RX_ERROR_PHY | \
  668. KS_DESC_RX_ERROR_TOO_LONG)
  669. #define KS_DESC_HW_OWNED 0x80000000
  670. #define KS_DESC_BUF_SIZE 0x000007FF
  671. #define KS884X_DESC_TX_PORT_MASK 0x00300000
  672. #define KS_DESC_END_OF_RING 0x02000000
  673. #define KS_DESC_TX_CSUM_GEN_UDP 0x04000000
  674. #define KS_DESC_TX_CSUM_GEN_TCP 0x08000000
  675. #define KS_DESC_TX_CSUM_GEN_IP 0x10000000
  676. #define KS_DESC_TX_LAST 0x20000000
  677. #define KS_DESC_TX_FIRST 0x40000000
  678. #define KS_DESC_TX_INTERRUPT 0x80000000
  679. #define KS_DESC_PORT_SHIFT 20
  680. #define KS_DESC_RX_MASK (KS_DESC_BUF_SIZE)
  681. #define KS_DESC_TX_MASK \
  682. (KS_DESC_TX_INTERRUPT | \
  683. KS_DESC_TX_FIRST | \
  684. KS_DESC_TX_LAST | \
  685. KS_DESC_TX_CSUM_GEN_IP | \
  686. KS_DESC_TX_CSUM_GEN_TCP | \
  687. KS_DESC_TX_CSUM_GEN_UDP | \
  688. KS_DESC_BUF_SIZE)
  689. struct ksz_desc_rx_stat {
  690. #ifdef __BIG_ENDIAN_BITFIELD
  691. u32 hw_owned:1;
  692. u32 first_desc:1;
  693. u32 last_desc:1;
  694. u32 csum_err_ip:1;
  695. u32 csum_err_tcp:1;
  696. u32 csum_err_udp:1;
  697. u32 error:1;
  698. u32 multicast:1;
  699. u32 src_port:4;
  700. u32 err_phy:1;
  701. u32 err_too_long:1;
  702. u32 err_runt:1;
  703. u32 err_crc:1;
  704. u32 frame_type:1;
  705. u32 reserved1:4;
  706. u32 frame_len:11;
  707. #else
  708. u32 frame_len:11;
  709. u32 reserved1:4;
  710. u32 frame_type:1;
  711. u32 err_crc:1;
  712. u32 err_runt:1;
  713. u32 err_too_long:1;
  714. u32 err_phy:1;
  715. u32 src_port:4;
  716. u32 multicast:1;
  717. u32 error:1;
  718. u32 csum_err_udp:1;
  719. u32 csum_err_tcp:1;
  720. u32 csum_err_ip:1;
  721. u32 last_desc:1;
  722. u32 first_desc:1;
  723. u32 hw_owned:1;
  724. #endif
  725. };
  726. struct ksz_desc_tx_stat {
  727. #ifdef __BIG_ENDIAN_BITFIELD
  728. u32 hw_owned:1;
  729. u32 reserved1:31;
  730. #else
  731. u32 reserved1:31;
  732. u32 hw_owned:1;
  733. #endif
  734. };
  735. struct ksz_desc_rx_buf {
  736. #ifdef __BIG_ENDIAN_BITFIELD
  737. u32 reserved4:6;
  738. u32 end_of_ring:1;
  739. u32 reserved3:14;
  740. u32 buf_size:11;
  741. #else
  742. u32 buf_size:11;
  743. u32 reserved3:14;
  744. u32 end_of_ring:1;
  745. u32 reserved4:6;
  746. #endif
  747. };
  748. struct ksz_desc_tx_buf {
  749. #ifdef __BIG_ENDIAN_BITFIELD
  750. u32 intr:1;
  751. u32 first_seg:1;
  752. u32 last_seg:1;
  753. u32 csum_gen_ip:1;
  754. u32 csum_gen_tcp:1;
  755. u32 csum_gen_udp:1;
  756. u32 end_of_ring:1;
  757. u32 reserved4:1;
  758. u32 dest_port:4;
  759. u32 reserved3:9;
  760. u32 buf_size:11;
  761. #else
  762. u32 buf_size:11;
  763. u32 reserved3:9;
  764. u32 dest_port:4;
  765. u32 reserved4:1;
  766. u32 end_of_ring:1;
  767. u32 csum_gen_udp:1;
  768. u32 csum_gen_tcp:1;
  769. u32 csum_gen_ip:1;
  770. u32 last_seg:1;
  771. u32 first_seg:1;
  772. u32 intr:1;
  773. #endif
  774. };
  775. union desc_stat {
  776. struct ksz_desc_rx_stat rx;
  777. struct ksz_desc_tx_stat tx;
  778. u32 data;
  779. };
  780. union desc_buf {
  781. struct ksz_desc_rx_buf rx;
  782. struct ksz_desc_tx_buf tx;
  783. u32 data;
  784. };
  785. /**
  786. * struct ksz_hw_desc - Hardware descriptor data structure
  787. * @ctrl: Descriptor control value.
  788. * @buf: Descriptor buffer value.
  789. * @addr: Physical address of memory buffer.
  790. * @next: Pointer to next hardware descriptor.
  791. */
  792. struct ksz_hw_desc {
  793. union desc_stat ctrl;
  794. union desc_buf buf;
  795. u32 addr;
  796. u32 next;
  797. };
  798. /**
  799. * struct ksz_sw_desc - Software descriptor data structure
  800. * @ctrl: Descriptor control value.
  801. * @buf: Descriptor buffer value.
  802. * @buf_size: Current buffers size value in hardware descriptor.
  803. */
  804. struct ksz_sw_desc {
  805. union desc_stat ctrl;
  806. union desc_buf buf;
  807. u32 buf_size;
  808. };
  809. /**
  810. * struct ksz_dma_buf - OS dependent DMA buffer data structure
  811. * @skb: Associated socket buffer.
  812. * @dma: Associated physical DMA address.
  813. * len: Actual len used.
  814. */
  815. struct ksz_dma_buf {
  816. struct sk_buff *skb;
  817. dma_addr_t dma;
  818. int len;
  819. };
  820. /**
  821. * struct ksz_desc - Descriptor structure
  822. * @phw: Hardware descriptor pointer to uncached physical memory.
  823. * @sw: Cached memory to hold hardware descriptor values for
  824. * manipulation.
  825. * @dma_buf: Operating system dependent data structure to hold physical
  826. * memory buffer allocation information.
  827. */
  828. struct ksz_desc {
  829. struct ksz_hw_desc *phw;
  830. struct ksz_sw_desc sw;
  831. struct ksz_dma_buf dma_buf;
  832. };
  833. #define DMA_BUFFER(desc) ((struct ksz_dma_buf *)(&(desc)->dma_buf))
  834. /**
  835. * struct ksz_desc_info - Descriptor information data structure
  836. * @ring: First descriptor in the ring.
  837. * @cur: Current descriptor being manipulated.
  838. * @ring_virt: First hardware descriptor in the ring.
  839. * @ring_phys: The physical address of the first descriptor of the ring.
  840. * @size: Size of hardware descriptor.
  841. * @alloc: Number of descriptors allocated.
  842. * @avail: Number of descriptors available for use.
  843. * @last: Index for last descriptor released to hardware.
  844. * @next: Index for next descriptor available for use.
  845. * @mask: Mask for index wrapping.
  846. */
  847. struct ksz_desc_info {
  848. struct ksz_desc *ring;
  849. struct ksz_desc *cur;
  850. struct ksz_hw_desc *ring_virt;
  851. u32 ring_phys;
  852. int size;
  853. int alloc;
  854. int avail;
  855. int last;
  856. int next;
  857. int mask;
  858. };
  859. /*
  860. * KSZ8842 switch definitions
  861. */
  862. enum {
  863. TABLE_STATIC_MAC = 0,
  864. TABLE_VLAN,
  865. TABLE_DYNAMIC_MAC,
  866. TABLE_MIB
  867. };
  868. #define LEARNED_MAC_TABLE_ENTRIES 1024
  869. #define STATIC_MAC_TABLE_ENTRIES 8
  870. /**
  871. * struct ksz_mac_table - Static MAC table data structure
  872. * @mac_addr: MAC address to filter.
  873. * @vid: VID value.
  874. * @fid: FID value.
  875. * @ports: Port membership.
  876. * @override: Override setting.
  877. * @use_fid: FID use setting.
  878. * @valid: Valid setting indicating the entry is being used.
  879. */
  880. struct ksz_mac_table {
  881. u8 mac_addr[ETH_ALEN];
  882. u16 vid;
  883. u8 fid;
  884. u8 ports;
  885. u8 override:1;
  886. u8 use_fid:1;
  887. u8 valid:1;
  888. };
  889. #define VLAN_TABLE_ENTRIES 16
  890. /**
  891. * struct ksz_vlan_table - VLAN table data structure
  892. * @vid: VID value.
  893. * @fid: FID value.
  894. * @member: Port membership.
  895. */
  896. struct ksz_vlan_table {
  897. u16 vid;
  898. u8 fid;
  899. u8 member;
  900. };
  901. #define DIFFSERV_ENTRIES 64
  902. #define PRIO_802_1P_ENTRIES 8
  903. #define PRIO_QUEUES 4
  904. #define SWITCH_PORT_NUM 2
  905. #define TOTAL_PORT_NUM (SWITCH_PORT_NUM + 1)
  906. #define HOST_MASK (1 << SWITCH_PORT_NUM)
  907. #define PORT_MASK 7
  908. #define MAIN_PORT 0
  909. #define OTHER_PORT 1
  910. #define HOST_PORT SWITCH_PORT_NUM
  911. #define PORT_COUNTER_NUM 0x20
  912. #define TOTAL_PORT_COUNTER_NUM (PORT_COUNTER_NUM + 2)
  913. #define MIB_COUNTER_RX_LO_PRIORITY 0x00
  914. #define MIB_COUNTER_RX_HI_PRIORITY 0x01
  915. #define MIB_COUNTER_RX_UNDERSIZE 0x02
  916. #define MIB_COUNTER_RX_FRAGMENT 0x03
  917. #define MIB_COUNTER_RX_OVERSIZE 0x04
  918. #define MIB_COUNTER_RX_JABBER 0x05
  919. #define MIB_COUNTER_RX_SYMBOL_ERR 0x06
  920. #define MIB_COUNTER_RX_CRC_ERR 0x07
  921. #define MIB_COUNTER_RX_ALIGNMENT_ERR 0x08
  922. #define MIB_COUNTER_RX_CTRL_8808 0x09
  923. #define MIB_COUNTER_RX_PAUSE 0x0A
  924. #define MIB_COUNTER_RX_BROADCAST 0x0B
  925. #define MIB_COUNTER_RX_MULTICAST 0x0C
  926. #define MIB_COUNTER_RX_UNICAST 0x0D
  927. #define MIB_COUNTER_RX_OCTET_64 0x0E
  928. #define MIB_COUNTER_RX_OCTET_65_127 0x0F
  929. #define MIB_COUNTER_RX_OCTET_128_255 0x10
  930. #define MIB_COUNTER_RX_OCTET_256_511 0x11
  931. #define MIB_COUNTER_RX_OCTET_512_1023 0x12
  932. #define MIB_COUNTER_RX_OCTET_1024_1522 0x13
  933. #define MIB_COUNTER_TX_LO_PRIORITY 0x14
  934. #define MIB_COUNTER_TX_HI_PRIORITY 0x15
  935. #define MIB_COUNTER_TX_LATE_COLLISION 0x16
  936. #define MIB_COUNTER_TX_PAUSE 0x17
  937. #define MIB_COUNTER_TX_BROADCAST 0x18
  938. #define MIB_COUNTER_TX_MULTICAST 0x19
  939. #define MIB_COUNTER_TX_UNICAST 0x1A
  940. #define MIB_COUNTER_TX_DEFERRED 0x1B
  941. #define MIB_COUNTER_TX_TOTAL_COLLISION 0x1C
  942. #define MIB_COUNTER_TX_EXCESS_COLLISION 0x1D
  943. #define MIB_COUNTER_TX_SINGLE_COLLISION 0x1E
  944. #define MIB_COUNTER_TX_MULTI_COLLISION 0x1F
  945. #define MIB_COUNTER_RX_DROPPED_PACKET 0x20
  946. #define MIB_COUNTER_TX_DROPPED_PACKET 0x21
  947. /**
  948. * struct ksz_port_mib - Port MIB data structure
  949. * @cnt_ptr: Current pointer to MIB counter index.
  950. * @link_down: Indication the link has just gone down.
  951. * @state: Connection status of the port.
  952. * @mib_start: The starting counter index. Some ports do not start at 0.
  953. * @counter: 64-bit MIB counter value.
  954. * @dropped: Temporary buffer to remember last read packet dropped values.
  955. *
  956. * MIB counters needs to be read periodically so that counters do not get
  957. * overflowed and give incorrect values. A right balance is needed to
  958. * satisfy this condition and not waste too much CPU time.
  959. *
  960. * It is pointless to read MIB counters when the port is disconnected. The
  961. * @state provides the connection status so that MIB counters are read only
  962. * when the port is connected. The @link_down indicates the port is just
  963. * disconnected so that all MIB counters are read one last time to update the
  964. * information.
  965. */
  966. struct ksz_port_mib {
  967. u8 cnt_ptr;
  968. u8 link_down;
  969. u8 state;
  970. u8 mib_start;
  971. u64 counter[TOTAL_PORT_COUNTER_NUM];
  972. u32 dropped[2];
  973. };
  974. /**
  975. * struct ksz_port_cfg - Port configuration data structure
  976. * @vid: VID value.
  977. * @member: Port membership.
  978. * @port_prio: Port priority.
  979. * @rx_rate: Receive priority rate.
  980. * @tx_rate: Transmit priority rate.
  981. * @stp_state: Current Spanning Tree Protocol state.
  982. */
  983. struct ksz_port_cfg {
  984. u16 vid;
  985. u8 member;
  986. u8 port_prio;
  987. u32 rx_rate[PRIO_QUEUES];
  988. u32 tx_rate[PRIO_QUEUES];
  989. int stp_state;
  990. };
  991. /**
  992. * struct ksz_switch - KSZ8842 switch data structure
  993. * @mac_table: MAC table entries information.
  994. * @vlan_table: VLAN table entries information.
  995. * @port_cfg: Port configuration information.
  996. * @diffserv: DiffServ priority settings. Possible values from 6-bit of ToS
  997. * (bit7 ~ bit2) field.
  998. * @p_802_1p: 802.1P priority settings. Possible values from 3-bit of 802.1p
  999. * Tag priority field.
  1000. * @br_addr: Bridge address. Used for STP.
  1001. * @other_addr: Other MAC address. Used for multiple network device mode.
  1002. * @broad_per: Broadcast storm percentage.
  1003. * @member: Current port membership. Used for STP.
  1004. */
  1005. struct ksz_switch {
  1006. struct ksz_mac_table mac_table[STATIC_MAC_TABLE_ENTRIES];
  1007. struct ksz_vlan_table vlan_table[VLAN_TABLE_ENTRIES];
  1008. struct ksz_port_cfg port_cfg[TOTAL_PORT_NUM];
  1009. u8 diffserv[DIFFSERV_ENTRIES];
  1010. u8 p_802_1p[PRIO_802_1P_ENTRIES];
  1011. u8 br_addr[ETH_ALEN];
  1012. u8 other_addr[ETH_ALEN];
  1013. u8 broad_per;
  1014. u8 member;
  1015. };
  1016. #define TX_RATE_UNIT 10000
  1017. /**
  1018. * struct ksz_port_info - Port information data structure
  1019. * @state: Connection status of the port.
  1020. * @tx_rate: Transmit rate divided by 10000 to get Mbit.
  1021. * @duplex: Duplex mode.
  1022. * @advertised: Advertised auto-negotiation setting. Used to determine link.
  1023. * @partner: Auto-negotiation partner setting. Used to determine link.
  1024. * @port_id: Port index to access actual hardware register.
  1025. * @pdev: Pointer to OS dependent network device.
  1026. */
  1027. struct ksz_port_info {
  1028. uint state;
  1029. uint tx_rate;
  1030. u8 duplex;
  1031. u8 advertised;
  1032. u8 partner;
  1033. u8 port_id;
  1034. void *pdev;
  1035. };
  1036. #define MAX_TX_HELD_SIZE 52000
  1037. /* Hardware features and bug fixes. */
  1038. #define LINK_INT_WORKING (1 << 0)
  1039. #define SMALL_PACKET_TX_BUG (1 << 1)
  1040. #define HALF_DUPLEX_SIGNAL_BUG (1 << 2)
  1041. #define RX_HUGE_FRAME (1 << 4)
  1042. #define STP_SUPPORT (1 << 8)
  1043. /* Software overrides. */
  1044. #define PAUSE_FLOW_CTRL (1 << 0)
  1045. #define FAST_AGING (1 << 1)
  1046. /**
  1047. * struct ksz_hw - KSZ884X hardware data structure
  1048. * @io: Virtual address assigned.
  1049. * @ksz_switch: Pointer to KSZ8842 switch.
  1050. * @port_info: Port information.
  1051. * @port_mib: Port MIB information.
  1052. * @dev_count: Number of network devices this hardware supports.
  1053. * @dst_ports: Destination ports in switch for transmission.
  1054. * @id: Hardware ID. Used for display only.
  1055. * @mib_cnt: Number of MIB counters this hardware has.
  1056. * @mib_port_cnt: Number of ports with MIB counters.
  1057. * @tx_cfg: Cached transmit control settings.
  1058. * @rx_cfg: Cached receive control settings.
  1059. * @intr_mask: Current interrupt mask.
  1060. * @intr_set: Current interrup set.
  1061. * @intr_blocked: Interrupt blocked.
  1062. * @rx_desc_info: Receive descriptor information.
  1063. * @tx_desc_info: Transmit descriptor information.
  1064. * @tx_int_cnt: Transmit interrupt count. Used for TX optimization.
  1065. * @tx_int_mask: Transmit interrupt mask. Used for TX optimization.
  1066. * @tx_size: Transmit data size. Used for TX optimization.
  1067. * The maximum is defined by MAX_TX_HELD_SIZE.
  1068. * @perm_addr: Permanent MAC address.
  1069. * @override_addr: Overridden MAC address.
  1070. * @address: Additional MAC address entries.
  1071. * @addr_list_size: Additional MAC address list size.
  1072. * @mac_override: Indication of MAC address overridden.
  1073. * @promiscuous: Counter to keep track of promiscuous mode set.
  1074. * @all_multi: Counter to keep track of all multicast mode set.
  1075. * @multi_list: Multicast address entries.
  1076. * @multi_bits: Cached multicast hash table settings.
  1077. * @multi_list_size: Multicast address list size.
  1078. * @enabled: Indication of hardware enabled.
  1079. * @rx_stop: Indication of receive process stop.
  1080. * @features: Hardware features to enable.
  1081. * @overrides: Hardware features to override.
  1082. * @parent: Pointer to parent, network device private structure.
  1083. */
  1084. struct ksz_hw {
  1085. void __iomem *io;
  1086. struct ksz_switch *ksz_switch;
  1087. struct ksz_port_info port_info[SWITCH_PORT_NUM];
  1088. struct ksz_port_mib port_mib[TOTAL_PORT_NUM];
  1089. int dev_count;
  1090. int dst_ports;
  1091. int id;
  1092. int mib_cnt;
  1093. int mib_port_cnt;
  1094. u32 tx_cfg;
  1095. u32 rx_cfg;
  1096. u32 intr_mask;
  1097. u32 intr_set;
  1098. uint intr_blocked;
  1099. struct ksz_desc_info rx_desc_info;
  1100. struct ksz_desc_info tx_desc_info;
  1101. int tx_int_cnt;
  1102. int tx_int_mask;
  1103. int tx_size;
  1104. u8 perm_addr[ETH_ALEN];
  1105. u8 override_addr[ETH_ALEN];
  1106. u8 address[ADDITIONAL_ENTRIES][ETH_ALEN];
  1107. u8 addr_list_size;
  1108. u8 mac_override;
  1109. u8 promiscuous;
  1110. u8 all_multi;
  1111. u8 multi_list[MAX_MULTICAST_LIST][ETH_ALEN];
  1112. u8 multi_bits[HW_MULTICAST_SIZE];
  1113. u8 multi_list_size;
  1114. u8 enabled;
  1115. u8 rx_stop;
  1116. u8 reserved2[1];
  1117. uint features;
  1118. uint overrides;
  1119. void *parent;
  1120. };
  1121. enum {
  1122. PHY_NO_FLOW_CTRL,
  1123. PHY_FLOW_CTRL,
  1124. PHY_TX_ONLY,
  1125. PHY_RX_ONLY
  1126. };
  1127. /**
  1128. * struct ksz_port - Virtual port data structure
  1129. * @duplex: Duplex mode setting. 1 for half duplex, 2 for full
  1130. * duplex, and 0 for auto, which normally results in full
  1131. * duplex.
  1132. * @speed: Speed setting. 10 for 10 Mbit, 100 for 100 Mbit, and
  1133. * 0 for auto, which normally results in 100 Mbit.
  1134. * @force_link: Force link setting. 0 for auto-negotiation, and 1 for
  1135. * force.
  1136. * @flow_ctrl: Flow control setting. PHY_NO_FLOW_CTRL for no flow
  1137. * control, and PHY_FLOW_CTRL for flow control.
  1138. * PHY_TX_ONLY and PHY_RX_ONLY are not supported for 100
  1139. * Mbit PHY.
  1140. * @first_port: Index of first port this port supports.
  1141. * @mib_port_cnt: Number of ports with MIB counters.
  1142. * @port_cnt: Number of ports this port supports.
  1143. * @counter: Port statistics counter.
  1144. * @hw: Pointer to hardware structure.
  1145. * @linked: Pointer to port information linked to this port.
  1146. */
  1147. struct ksz_port {
  1148. u8 duplex;
  1149. u8 speed;
  1150. u8 force_link;
  1151. u8 flow_ctrl;
  1152. int first_port;
  1153. int mib_port_cnt;
  1154. int port_cnt;
  1155. u64 counter[OID_COUNTER_LAST];
  1156. struct ksz_hw *hw;
  1157. struct ksz_port_info *linked;
  1158. };
  1159. /**
  1160. * struct ksz_timer_info - Timer information data structure
  1161. * @timer: Kernel timer.
  1162. * @cnt: Running timer counter.
  1163. * @max: Number of times to run timer; -1 for infinity.
  1164. * @period: Timer period in jiffies.
  1165. */
  1166. struct ksz_timer_info {
  1167. struct timer_list timer;
  1168. int cnt;
  1169. int max;
  1170. int period;
  1171. };
  1172. /**
  1173. * struct ksz_shared_mem - OS dependent shared memory data structure
  1174. * @dma_addr: Physical DMA address allocated.
  1175. * @alloc_size: Allocation size.
  1176. * @phys: Actual physical address used.
  1177. * @alloc_virt: Virtual address allocated.
  1178. * @virt: Actual virtual address used.
  1179. */
  1180. struct ksz_shared_mem {
  1181. dma_addr_t dma_addr;
  1182. uint alloc_size;
  1183. uint phys;
  1184. u8 *alloc_virt;
  1185. u8 *virt;
  1186. };
  1187. /**
  1188. * struct ksz_counter_info - OS dependent counter information data structure
  1189. * @counter: Wait queue to wakeup after counters are read.
  1190. * @time: Next time in jiffies to read counter.
  1191. * @read: Indication of counters read in full or not.
  1192. */
  1193. struct ksz_counter_info {
  1194. wait_queue_head_t counter;
  1195. unsigned long time;
  1196. int read;
  1197. };
  1198. /**
  1199. * struct dev_info - Network device information data structure
  1200. * @dev: Pointer to network device.
  1201. * @pdev: Pointer to PCI device.
  1202. * @hw: Hardware structure.
  1203. * @desc_pool: Physical memory used for descriptor pool.
  1204. * @hwlock: Spinlock to prevent hardware from accessing.
  1205. * @lock: Mutex lock to prevent device from accessing.
  1206. * @dev_rcv: Receive process function used.
  1207. * @last_skb: Socket buffer allocated for descriptor rx fragments.
  1208. * @skb_index: Buffer index for receiving fragments.
  1209. * @skb_len: Buffer length for receiving fragments.
  1210. * @mib_read: Workqueue to read MIB counters.
  1211. * @mib_timer_info: Timer to read MIB counters.
  1212. * @counter: Used for MIB reading.
  1213. * @mtu: Current MTU used. The default is REGULAR_RX_BUF_SIZE;
  1214. * the maximum is MAX_RX_BUF_SIZE.
  1215. * @opened: Counter to keep track of device open.
  1216. * @rx_tasklet: Receive processing tasklet.
  1217. * @tx_tasklet: Transmit processing tasklet.
  1218. * @wol_enable: Wake-on-LAN enable set by ethtool.
  1219. * @wol_support: Wake-on-LAN support used by ethtool.
  1220. * @pme_wait: Used for KSZ8841 power management.
  1221. */
  1222. struct dev_info {
  1223. struct net_device *dev;
  1224. struct pci_dev *pdev;
  1225. struct ksz_hw hw;
  1226. struct ksz_shared_mem desc_pool;
  1227. spinlock_t hwlock;
  1228. struct mutex lock;
  1229. int (*dev_rcv)(struct dev_info *);
  1230. struct sk_buff *last_skb;
  1231. int skb_index;
  1232. int skb_len;
  1233. struct work_struct mib_read;
  1234. struct ksz_timer_info mib_timer_info;
  1235. struct ksz_counter_info counter[TOTAL_PORT_NUM];
  1236. int mtu;
  1237. int opened;
  1238. struct tasklet_struct rx_tasklet;
  1239. struct tasklet_struct tx_tasklet;
  1240. int wol_enable;
  1241. int wol_support;
  1242. unsigned long pme_wait;
  1243. };
  1244. /**
  1245. * struct dev_priv - Network device private data structure
  1246. * @adapter: Adapter device information.
  1247. * @port: Port information.
  1248. * @monitor_time_info: Timer to monitor ports.
  1249. * @proc_sem: Semaphore for proc accessing.
  1250. * @id: Device ID.
  1251. * @mii_if: MII interface information.
  1252. * @advertising: Temporary variable to store advertised settings.
  1253. * @msg_enable: The message flags controlling driver output.
  1254. * @media_state: The connection status of the device.
  1255. * @multicast: The all multicast state of the device.
  1256. * @promiscuous: The promiscuous state of the device.
  1257. */
  1258. struct dev_priv {
  1259. struct dev_info *adapter;
  1260. struct ksz_port port;
  1261. struct ksz_timer_info monitor_timer_info;
  1262. struct semaphore proc_sem;
  1263. int id;
  1264. struct mii_if_info mii_if;
  1265. u32 advertising;
  1266. u32 msg_enable;
  1267. int media_state;
  1268. int multicast;
  1269. int promiscuous;
  1270. };
  1271. #define DRV_NAME "KSZ884X PCI"
  1272. #define DEVICE_NAME "KSZ884x PCI"
  1273. #define DRV_VERSION "1.0.0"
  1274. #define DRV_RELDATE "Feb 8, 2010"
  1275. static char version[] =
  1276. "Micrel " DEVICE_NAME " " DRV_VERSION " (" DRV_RELDATE ")";
  1277. static u8 DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x88, 0x42, 0x01 };
  1278. /*
  1279. * Interrupt processing primary routines
  1280. */
  1281. static inline void hw_ack_intr(struct ksz_hw *hw, uint interrupt)
  1282. {
  1283. writel(interrupt, hw->io + KS884X_INTERRUPTS_STATUS);
  1284. }
  1285. static inline void hw_dis_intr(struct ksz_hw *hw)
  1286. {
  1287. hw->intr_blocked = hw->intr_mask;
  1288. writel(0, hw->io + KS884X_INTERRUPTS_ENABLE);
  1289. hw->intr_set = readl(hw->io + KS884X_INTERRUPTS_ENABLE);
  1290. }
  1291. static inline void hw_set_intr(struct ksz_hw *hw, uint interrupt)
  1292. {
  1293. hw->intr_set = interrupt;
  1294. writel(interrupt, hw->io + KS884X_INTERRUPTS_ENABLE);
  1295. }
  1296. static inline void hw_ena_intr(struct ksz_hw *hw)
  1297. {
  1298. hw->intr_blocked = 0;
  1299. hw_set_intr(hw, hw->intr_mask);
  1300. }
  1301. static inline void hw_dis_intr_bit(struct ksz_hw *hw, uint bit)
  1302. {
  1303. hw->intr_mask &= ~(bit);
  1304. }
  1305. static inline void hw_turn_off_intr(struct ksz_hw *hw, uint interrupt)
  1306. {
  1307. u32 read_intr;
  1308. read_intr = readl(hw->io + KS884X_INTERRUPTS_ENABLE);
  1309. hw->intr_set = read_intr & ~interrupt;
  1310. writel(hw->intr_set, hw->io + KS884X_INTERRUPTS_ENABLE);
  1311. hw_dis_intr_bit(hw, interrupt);
  1312. }
  1313. /**
  1314. * hw_turn_on_intr - turn on specified interrupts
  1315. * @hw: The hardware instance.
  1316. * @bit: The interrupt bits to be on.
  1317. *
  1318. * This routine turns on the specified interrupts in the interrupt mask so that
  1319. * those interrupts will be enabled.
  1320. */
  1321. static void hw_turn_on_intr(struct ksz_hw *hw, u32 bit)
  1322. {
  1323. hw->intr_mask |= bit;
  1324. if (!hw->intr_blocked)
  1325. hw_set_intr(hw, hw->intr_mask);
  1326. }
  1327. static inline void hw_ena_intr_bit(struct ksz_hw *hw, uint interrupt)
  1328. {
  1329. u32 read_intr;
  1330. read_intr = readl(hw->io + KS884X_INTERRUPTS_ENABLE);
  1331. hw->intr_set = read_intr | interrupt;
  1332. writel(hw->intr_set, hw->io + KS884X_INTERRUPTS_ENABLE);
  1333. }
  1334. static inline void hw_read_intr(struct ksz_hw *hw, uint *status)
  1335. {
  1336. *status = readl(hw->io + KS884X_INTERRUPTS_STATUS);
  1337. *status = *status & hw->intr_set;
  1338. }
  1339. static inline void hw_restore_intr(struct ksz_hw *hw, uint interrupt)
  1340. {
  1341. if (interrupt)
  1342. hw_ena_intr(hw);
  1343. }
  1344. /**
  1345. * hw_block_intr - block hardware interrupts
  1346. *
  1347. * This function blocks all interrupts of the hardware and returns the current
  1348. * interrupt enable mask so that interrupts can be restored later.
  1349. *
  1350. * Return the current interrupt enable mask.
  1351. */
  1352. static uint hw_block_intr(struct ksz_hw *hw)
  1353. {
  1354. uint interrupt = 0;
  1355. if (!hw->intr_blocked) {
  1356. hw_dis_intr(hw);
  1357. interrupt = hw->intr_blocked;
  1358. }
  1359. return interrupt;
  1360. }
  1361. /*
  1362. * Hardware descriptor routines
  1363. */
  1364. static inline void reset_desc(struct ksz_desc *desc, union desc_stat status)
  1365. {
  1366. status.rx.hw_owned = 0;
  1367. desc->phw->ctrl.data = cpu_to_le32(status.data);
  1368. }
  1369. static inline void release_desc(struct ksz_desc *desc)
  1370. {
  1371. desc->sw.ctrl.tx.hw_owned = 1;
  1372. if (desc->sw.buf_size != desc->sw.buf.data) {
  1373. desc->sw.buf_size = desc->sw.buf.data;
  1374. desc->phw->buf.data = cpu_to_le32(desc->sw.buf.data);
  1375. }
  1376. desc->phw->ctrl.data = cpu_to_le32(desc->sw.ctrl.data);
  1377. }
  1378. static void get_rx_pkt(struct ksz_desc_info *info, struct ksz_desc **desc)
  1379. {
  1380. *desc = &info->ring[info->last];
  1381. info->last++;
  1382. info->last &= info->mask;
  1383. info->avail--;
  1384. (*desc)->sw.buf.data &= ~KS_DESC_RX_MASK;
  1385. }
  1386. static inline void set_rx_buf(struct ksz_desc *desc, u32 addr)
  1387. {
  1388. desc->phw->addr = cpu_to_le32(addr);
  1389. }
  1390. static inline void set_rx_len(struct ksz_desc *desc, u32 len)
  1391. {
  1392. desc->sw.buf.rx.buf_size = len;
  1393. }
  1394. static inline void get_tx_pkt(struct ksz_desc_info *info,
  1395. struct ksz_desc **desc)
  1396. {
  1397. *desc = &info->ring[info->next];
  1398. info->next++;
  1399. info->next &= info->mask;
  1400. info->avail--;
  1401. (*desc)->sw.buf.data &= ~KS_DESC_TX_MASK;
  1402. }
  1403. static inline void set_tx_buf(struct ksz_desc *desc, u32 addr)
  1404. {
  1405. desc->phw->addr = cpu_to_le32(addr);
  1406. }
  1407. static inline void set_tx_len(struct ksz_desc *desc, u32 len)
  1408. {
  1409. desc->sw.buf.tx.buf_size = len;
  1410. }
  1411. /* Switch functions */
  1412. #define TABLE_READ 0x10
  1413. #define TABLE_SEL_SHIFT 2
  1414. #define HW_DELAY(hw, reg) \
  1415. do { \
  1416. u16 dummy; \
  1417. dummy = readw(hw->io + reg); \
  1418. } while (0)
  1419. /**
  1420. * sw_r_table - read 4 bytes of data from switch table
  1421. * @hw: The hardware instance.
  1422. * @table: The table selector.
  1423. * @addr: The address of the table entry.
  1424. * @data: Buffer to store the read data.
  1425. *
  1426. * This routine reads 4 bytes of data from the table of the switch.
  1427. * Hardware interrupts are disabled to minimize corruption of read data.
  1428. */
  1429. static void sw_r_table(struct ksz_hw *hw, int table, u16 addr, u32 *data)
  1430. {
  1431. u16 ctrl_addr;
  1432. uint interrupt;
  1433. ctrl_addr = (((table << TABLE_SEL_SHIFT) | TABLE_READ) << 8) | addr;
  1434. interrupt = hw_block_intr(hw);
  1435. writew(ctrl_addr, hw->io + KS884X_IACR_OFFSET);
  1436. HW_DELAY(hw, KS884X_IACR_OFFSET);
  1437. *data = readl(hw->io + KS884X_ACC_DATA_0_OFFSET);
  1438. hw_restore_intr(hw, interrupt);
  1439. }
  1440. /**
  1441. * sw_w_table_64 - write 8 bytes of data to the switch table
  1442. * @hw: The hardware instance.
  1443. * @table: The table selector.
  1444. * @addr: The address of the table entry.
  1445. * @data_hi: The high part of data to be written (bit63 ~ bit32).
  1446. * @data_lo: The low part of data to be written (bit31 ~ bit0).
  1447. *
  1448. * This routine writes 8 bytes of data to the table of the switch.
  1449. * Hardware interrupts are disabled to minimize corruption of written data.
  1450. */
  1451. static void sw_w_table_64(struct ksz_hw *hw, int table, u16 addr, u32 data_hi,
  1452. u32 data_lo)
  1453. {
  1454. u16 ctrl_addr;
  1455. uint interrupt;
  1456. ctrl_addr = ((table << TABLE_SEL_SHIFT) << 8) | addr;
  1457. interrupt = hw_block_intr(hw);
  1458. writel(data_hi, hw->io + KS884X_ACC_DATA_4_OFFSET);
  1459. writel(data_lo, hw->io + KS884X_ACC_DATA_0_OFFSET);
  1460. writew(ctrl_addr, hw->io + KS884X_IACR_OFFSET);
  1461. HW_DELAY(hw, KS884X_IACR_OFFSET);
  1462. hw_restore_intr(hw, interrupt);
  1463. }
  1464. /**
  1465. * sw_w_sta_mac_table - write to the static MAC table
  1466. * @hw: The hardware instance.
  1467. * @addr: The address of the table entry.
  1468. * @mac_addr: The MAC address.
  1469. * @ports: The port members.
  1470. * @override: The flag to override the port receive/transmit settings.
  1471. * @valid: The flag to indicate entry is valid.
  1472. * @use_fid: The flag to indicate the FID is valid.
  1473. * @fid: The FID value.
  1474. *
  1475. * This routine writes an entry of the static MAC table of the switch. It
  1476. * calls sw_w_table_64() to write the data.
  1477. */
  1478. static void sw_w_sta_mac_table(struct ksz_hw *hw, u16 addr, u8 *mac_addr,
  1479. u8 ports, int override, int valid, int use_fid, u8 fid)
  1480. {
  1481. u32 data_hi;
  1482. u32 data_lo;
  1483. data_lo = ((u32) mac_addr[2] << 24) |
  1484. ((u32) mac_addr[3] << 16) |
  1485. ((u32) mac_addr[4] << 8) | mac_addr[5];
  1486. data_hi = ((u32) mac_addr[0] << 8) | mac_addr[1];
  1487. data_hi |= (u32) ports << STATIC_MAC_FWD_PORTS_SHIFT;
  1488. if (override)
  1489. data_hi |= STATIC_MAC_TABLE_OVERRIDE;
  1490. if (use_fid) {
  1491. data_hi |= STATIC_MAC_TABLE_USE_FID;
  1492. data_hi |= (u32) fid << STATIC_MAC_FID_SHIFT;
  1493. }
  1494. if (valid)
  1495. data_hi |= STATIC_MAC_TABLE_VALID;
  1496. sw_w_table_64(hw, TABLE_STATIC_MAC, addr, data_hi, data_lo);
  1497. }
  1498. /**
  1499. * sw_r_vlan_table - read from the VLAN table
  1500. * @hw: The hardware instance.
  1501. * @addr: The address of the table entry.
  1502. * @vid: Buffer to store the VID.
  1503. * @fid: Buffer to store the VID.
  1504. * @member: Buffer to store the port membership.
  1505. *
  1506. * This function reads an entry of the VLAN table of the switch. It calls
  1507. * sw_r_table() to get the data.
  1508. *
  1509. * Return 0 if the entry is valid; otherwise -1.
  1510. */
  1511. static int sw_r_vlan_table(struct ksz_hw *hw, u16 addr, u16 *vid, u8 *fid,
  1512. u8 *member)
  1513. {
  1514. u32 data;
  1515. sw_r_table(hw, TABLE_VLAN, addr, &data);
  1516. if (data & VLAN_TABLE_VALID) {
  1517. *vid = (u16)(data & VLAN_TABLE_VID);
  1518. *fid = (u8)((data & VLAN_TABLE_FID) >> VLAN_TABLE_FID_SHIFT);
  1519. *member = (u8)((data & VLAN_TABLE_MEMBERSHIP) >>
  1520. VLAN_TABLE_MEMBERSHIP_SHIFT);
  1521. return 0;
  1522. }
  1523. return -1;
  1524. }
  1525. /**
  1526. * port_r_mib_cnt - read MIB counter
  1527. * @hw: The hardware instance.
  1528. * @port: The port index.
  1529. * @addr: The address of the counter.
  1530. * @cnt: Buffer to store the counter.
  1531. *
  1532. * This routine reads a MIB counter of the port.
  1533. * Hardware interrupts are disabled to minimize corruption of read data.
  1534. */
  1535. static void port_r_mib_cnt(struct ksz_hw *hw, int port, u16 addr, u64 *cnt)
  1536. {
  1537. u32 data;
  1538. u16 ctrl_addr;
  1539. uint interrupt;
  1540. int timeout;
  1541. ctrl_addr = addr + PORT_COUNTER_NUM * port;
  1542. interrupt = hw_block_intr(hw);
  1543. ctrl_addr |= (((TABLE_MIB << TABLE_SEL_SHIFT) | TABLE_READ) << 8);
  1544. writew(ctrl_addr, hw->io + KS884X_IACR_OFFSET);
  1545. HW_DELAY(hw, KS884X_IACR_OFFSET);
  1546. for (timeout = 100; timeout > 0; timeout--) {
  1547. data = readl(hw->io + KS884X_ACC_DATA_0_OFFSET);
  1548. if (data & MIB_COUNTER_VALID) {
  1549. if (data & MIB_COUNTER_OVERFLOW)
  1550. *cnt += MIB_COUNTER_VALUE + 1;
  1551. *cnt += data & MIB_COUNTER_VALUE;
  1552. break;
  1553. }
  1554. }
  1555. hw_restore_intr(hw, interrupt);
  1556. }
  1557. /**
  1558. * port_r_mib_pkt - read dropped packet counts
  1559. * @hw: The hardware instance.
  1560. * @port: The port index.
  1561. * @cnt: Buffer to store the receive and transmit dropped packet counts.
  1562. *
  1563. * This routine reads the dropped packet counts of the port.
  1564. * Hardware interrupts are disabled to minimize corruption of read data.
  1565. */
  1566. static void port_r_mib_pkt(struct ksz_hw *hw, int port, u32 *last, u64 *cnt)
  1567. {
  1568. u32 cur;
  1569. u32 data;
  1570. u16 ctrl_addr;
  1571. uint interrupt;
  1572. int index;
  1573. index = KS_MIB_PACKET_DROPPED_RX_0 + port;
  1574. do {
  1575. interrupt = hw_block_intr(hw);
  1576. ctrl_addr = (u16) index;
  1577. ctrl_addr |= (((TABLE_MIB << TABLE_SEL_SHIFT) | T