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

net: pch_gbe: convert to use ndo_hwtstamp callbacks

The driver implemented SIOCSHWTSTAMP ioctl command only, but it stores
configuration in the private data, so it is possible to report it back
to users. Implement both ndo_hwtstamp_set and ndo_hwtstamp_get
callbacks. To properly report RX filter type, store it in hwts_rx_en
instead of using this field as a simple flag. The logic didn't change
because receive path used this field as boolean flag.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Reviewed-by: Kory Maincent <kory.maincent@bootlin.com>
Link: https://patch.msgid.link/20251103150952.3538205-7-vadim.fedorenko@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Vadim Fedorenko and committed by
Jakub Kicinski
d8fdc706 a23d0486

+23 -15
+23 -15
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
··· 198 198 pch_ch_event_write(pdev, TX_SNAPSHOT_LOCKED); 199 199 } 200 200 201 - static int hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) 201 + static int pch_gbe_hwtstamp_set(struct net_device *netdev, 202 + struct kernel_hwtstamp_config *cfg, 203 + struct netlink_ext_ack *extack) 202 204 { 203 - struct hwtstamp_config cfg; 204 205 struct pch_gbe_adapter *adapter = netdev_priv(netdev); 205 206 struct pci_dev *pdev; 206 207 u8 station[20]; 207 208 208 - if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) 209 - return -EFAULT; 210 - 211 209 /* Get ieee1588's dev information */ 212 210 pdev = adapter->ptp_pdev; 213 211 214 - if (cfg.tx_type != HWTSTAMP_TX_OFF && cfg.tx_type != HWTSTAMP_TX_ON) 212 + if (cfg->tx_type != HWTSTAMP_TX_OFF && cfg->tx_type != HWTSTAMP_TX_ON) 215 213 return -ERANGE; 216 214 217 - switch (cfg.rx_filter) { 215 + switch (cfg->rx_filter) { 218 216 case HWTSTAMP_FILTER_NONE: 219 217 adapter->hwts_rx_en = 0; 220 218 break; ··· 221 223 pch_ch_control_write(pdev, SLAVE_MODE | CAP_MODE0); 222 224 break; 223 225 case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: 224 - adapter->hwts_rx_en = 1; 226 + adapter->hwts_rx_en = cfg->rx_filter; 225 227 pch_ch_control_write(pdev, MASTER_MODE | CAP_MODE0); 226 228 break; 227 229 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: 228 - adapter->hwts_rx_en = 1; 230 + adapter->hwts_rx_en = cfg->rx_filter; 229 231 pch_ch_control_write(pdev, V2_MODE | CAP_MODE2); 230 232 strcpy(station, PTP_L4_MULTICAST_SA); 231 233 pch_set_station_address(station, pdev); 232 234 break; 233 235 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: 234 - adapter->hwts_rx_en = 1; 236 + adapter->hwts_rx_en = cfg->rx_filter; 235 237 pch_ch_control_write(pdev, V2_MODE | CAP_MODE2); 236 238 strcpy(station, PTP_L2_MULTICAST_SA); 237 239 pch_set_station_address(station, pdev); ··· 240 242 return -ERANGE; 241 243 } 242 244 243 - adapter->hwts_tx_en = cfg.tx_type == HWTSTAMP_TX_ON; 245 + adapter->hwts_tx_en = cfg->tx_type == HWTSTAMP_TX_ON; 244 246 245 247 /* Clear out any old time stamps. */ 246 248 pch_ch_event_write(pdev, TX_SNAPSHOT_LOCKED | RX_SNAPSHOT_LOCKED); 247 249 248 - return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; 250 + return 0; 251 + } 252 + 253 + static int pch_gbe_hwtstamp_get(struct net_device *netdev, 254 + struct kernel_hwtstamp_config *cfg) 255 + { 256 + struct pch_gbe_adapter *adapter = netdev_priv(netdev); 257 + 258 + cfg->tx_type = adapter->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; 259 + cfg->rx_filter = adapter->hwts_rx_en; 260 + 261 + return 0; 249 262 } 250 263 251 264 static inline void pch_gbe_mac_load_mac_addr(struct pch_gbe_hw *hw) ··· 2243 2234 2244 2235 netdev_dbg(netdev, "cmd : 0x%04x\n", cmd); 2245 2236 2246 - if (cmd == SIOCSHWTSTAMP) 2247 - return hwtstamp_ioctl(netdev, ifr, cmd); 2248 - 2249 2237 return generic_mii_ioctl(&adapter->mii, if_mii(ifr), cmd, NULL); 2250 2238 } 2251 2239 ··· 2334 2328 #ifdef CONFIG_NET_POLL_CONTROLLER 2335 2329 .ndo_poll_controller = pch_gbe_netpoll, 2336 2330 #endif 2331 + .ndo_hwtstamp_get = pch_gbe_hwtstamp_get, 2332 + .ndo_hwtstamp_set = pch_gbe_hwtstamp_set, 2337 2333 }; 2338 2334 2339 2335 static pci_ers_result_t pch_gbe_io_error_detected(struct pci_dev *pdev,