Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'txgbe-feat-new-aml-firmware'

Jiawen Wu says:

====================
TXGBE feat new AML firmware

The firmware of AML devices are redesigned to adapt to more PHY
interfaces. Optimize the driver to be compatible with the new firmware.

v1: https://lore.kernel.org/all/20250928093923.30456-1-jiawenwu@trustnetic.com/
====================

Link: https://patch.msgid.link/20251014061726.36660-1-jiawenwu@trustnetic.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+20 -41
-2
drivers/net/ethernet/wangxun/libwx/wx_type.h
··· 1271 1271 1272 1272 /* PHY stuff */ 1273 1273 bool notify_down; 1274 - int adv_speed; 1275 - int adv_duplex; 1276 1274 unsigned int link; 1277 1275 int speed; 1278 1276 int duplex;
+16 -38
drivers/net/ethernet/wangxun/txgbe/txgbe_aml.c
··· 19 19 { 20 20 u32 status; 21 21 22 - wr32(wx, WX_GPIO_INTTYPE_LEVEL, TXGBE_GPIOBIT_2 | TXGBE_GPIOBIT_3); 23 - wr32(wx, WX_GPIO_INTEN, TXGBE_GPIOBIT_2 | TXGBE_GPIOBIT_3); 22 + wr32(wx, WX_GPIO_INTTYPE_LEVEL, TXGBE_GPIOBIT_2); 23 + wr32(wx, WX_GPIO_INTEN, TXGBE_GPIOBIT_2); 24 24 25 25 status = rd32(wx, WX_GPIO_INTSTATUS); 26 26 for (int i = 0; i < 6; i++) { ··· 41 41 set_bit(WX_FLAG_NEED_SFP_RESET, wx->flags); 42 42 wr32(wx, WX_GPIO_EOI, TXGBE_GPIOBIT_2); 43 43 wx_service_event_schedule(wx); 44 - } 45 - if (status & TXGBE_GPIOBIT_3) { 46 - set_bit(WX_FLAG_NEED_LINK_CONFIG, wx->flags); 47 - wx_service_event_schedule(wx); 48 - wr32(wx, WX_GPIO_EOI, TXGBE_GPIOBIT_3); 49 44 } 50 45 51 46 wr32(wx, WX_GPIO_INTMASK, 0); ··· 91 96 case SPEED_10000: 92 97 buffer.speed = TXGBE_LINK_SPEED_10GB_FULL; 93 98 break; 99 + default: 100 + buffer.speed = TXGBE_LINK_SPEED_UNKNOWN; 101 + break; 94 102 } 95 103 96 104 buffer.fec_mode = TXGBE_PHY_FEC_AUTO; ··· 104 106 WX_HI_COMMAND_TIMEOUT, true); 105 107 } 106 108 107 - static void txgbe_get_link_capabilities(struct wx *wx) 109 + static void txgbe_get_link_capabilities(struct wx *wx, int *speed, int *duplex) 108 110 { 109 111 struct txgbe *txgbe = wx->priv; 110 112 111 113 if (test_bit(PHY_INTERFACE_MODE_25GBASER, txgbe->sfp_interfaces)) 112 - wx->adv_speed = SPEED_25000; 114 + *speed = SPEED_25000; 113 115 else if (test_bit(PHY_INTERFACE_MODE_10GBASER, txgbe->sfp_interfaces)) 114 - wx->adv_speed = SPEED_10000; 116 + *speed = SPEED_10000; 115 117 else 116 - wx->adv_speed = SPEED_UNKNOWN; 118 + *speed = SPEED_UNKNOWN; 117 119 118 - wx->adv_duplex = wx->adv_speed == SPEED_UNKNOWN ? 119 - DUPLEX_HALF : DUPLEX_FULL; 120 + *duplex = *speed == SPEED_UNKNOWN ? DUPLEX_HALF : DUPLEX_FULL; 120 121 } 121 122 122 - static void txgbe_get_phy_link(struct wx *wx, int *speed) 123 + static void txgbe_get_mac_link(struct wx *wx, int *speed) 123 124 { 124 125 u32 status; 125 126 ··· 135 138 136 139 int txgbe_set_phy_link(struct wx *wx) 137 140 { 138 - int speed, err; 139 - u32 gpio; 141 + int speed, duplex, err; 140 142 141 - /* Check RX signal */ 142 - gpio = rd32(wx, WX_GPIO_EXT); 143 - if (gpio & TXGBE_GPIOBIT_3) 144 - return -ENODEV; 143 + txgbe_get_link_capabilities(wx, &speed, &duplex); 145 144 146 - txgbe_get_link_capabilities(wx); 147 - if (wx->adv_speed == SPEED_UNKNOWN) 148 - return -ENODEV; 149 - 150 - txgbe_get_phy_link(wx, &speed); 151 - if (speed == wx->adv_speed) 152 - return 0; 153 - 154 - err = txgbe_set_phy_link_hostif(wx, wx->adv_speed, 0, wx->adv_duplex); 145 + err = txgbe_set_phy_link_hostif(wx, speed, 0, duplex); 155 146 if (err) { 156 147 wx_err(wx, "Failed to setup link\n"); 157 148 return err; ··· 215 230 return -ENODEV; 216 231 } 217 232 218 - err = txgbe_sfp_to_linkmodes(wx, id); 219 - if (err) 220 - return err; 221 - 222 - if (gpio & TXGBE_GPIOBIT_3) 223 - set_bit(WX_FLAG_NEED_LINK_CONFIG, wx->flags); 224 - 225 - return 0; 233 + return txgbe_sfp_to_linkmodes(wx, id); 226 234 } 227 235 228 236 void txgbe_setup_link(struct wx *wx) ··· 234 256 struct wx *wx = phylink_to_wx(config); 235 257 int speed; 236 258 237 - txgbe_get_phy_link(wx, &speed); 259 + txgbe_get_mac_link(wx, &speed); 238 260 state->link = speed != SPEED_UNKNOWN; 239 261 state->speed = speed; 240 262 state->duplex = state->link ? DUPLEX_FULL : DUPLEX_UNKNOWN;
+4 -1
drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
··· 314 314 int txgbe_setup_tc(struct net_device *dev, u8 tc); 315 315 void txgbe_do_reset(struct net_device *netdev); 316 316 317 + #define TXGBE_LINK_SPEED_UNKNOWN 0 317 318 #define TXGBE_LINK_SPEED_10GB_FULL 4 318 319 #define TXGBE_LINK_SPEED_25GB_FULL 0x10 319 320 ··· 353 352 u8 vendor_oui0; /* A0H 0x25 */ 354 353 u8 vendor_oui1; /* A0H 0x26 */ 355 354 u8 vendor_oui2; /* A0H 0x27 */ 356 - u8 reserved[3]; 355 + u8 transceiver_type; /* A0H 0x83 */ 356 + u8 sff_opt1; /* A0H 0xC0 */ 357 + u8 reserved[5]; 357 358 }; 358 359 359 360 struct txgbe_hic_i2c_read {