@@ -29,6 +29,147 @@ static void ef100_update_name(struct efx_nic *efx)
2929 strcpy (efx -> name , efx -> net_dev -> name );
3030}
3131
32+ static int ef100_alloc_vis (struct efx_nic * efx , unsigned int * allocated_vis )
33+ {
34+ /* EF100 uses a single TXQ per channel, as all checksum offloading
35+ * is configured in the TX descriptor, and there is no TX Pacer for
36+ * HIGHPRI queues.
37+ */
38+ unsigned int tx_vis = efx -> n_tx_channels + efx -> n_extra_tx_channels ;
39+ unsigned int rx_vis = efx -> n_rx_channels ;
40+ unsigned int min_vis , max_vis ;
41+
42+ EFX_WARN_ON_PARANOID (efx -> tx_queues_per_channel != 1 );
43+
44+ tx_vis += efx -> n_xdp_channels * efx -> xdp_tx_per_channel ;
45+
46+ max_vis = max (rx_vis , tx_vis );
47+ /* Currently don't handle resource starvation and only accept
48+ * our maximum needs and no less.
49+ */
50+ min_vis = max_vis ;
51+
52+ return efx_mcdi_alloc_vis (efx , min_vis , max_vis ,
53+ NULL , allocated_vis );
54+ }
55+
56+ static int ef100_remap_bar (struct efx_nic * efx , int max_vis )
57+ {
58+ unsigned int uc_mem_map_size ;
59+ void __iomem * membase ;
60+
61+ efx -> max_vis = max_vis ;
62+ uc_mem_map_size = PAGE_ALIGN (max_vis * efx -> vi_stride );
63+
64+ /* Extend the original UC mapping of the memory BAR */
65+ membase = ioremap (efx -> membase_phys , uc_mem_map_size );
66+ if (!membase ) {
67+ netif_err (efx , probe , efx -> net_dev ,
68+ "could not extend memory BAR to %x\n" ,
69+ uc_mem_map_size );
70+ return - ENOMEM ;
71+ }
72+ iounmap (efx -> membase );
73+ efx -> membase = membase ;
74+ return 0 ;
75+ }
76+
77+ /* Context: process, rtnl_lock() held.
78+ * Note that the kernel will ignore our return code; this method
79+ * should really be a void.
80+ */
81+ static int ef100_net_stop (struct net_device * net_dev )
82+ {
83+ struct efx_nic * efx = netdev_priv (net_dev );
84+
85+ netif_dbg (efx , ifdown , efx -> net_dev , "closing on CPU %d\n" ,
86+ raw_smp_processor_id ());
87+
88+ netif_stop_queue (net_dev );
89+ efx_stop_all (efx );
90+ efx_disable_interrupts (efx );
91+ efx_clear_interrupt_affinity (efx );
92+ efx_nic_fini_interrupt (efx );
93+ efx_fini_napi (efx );
94+ efx_remove_channels (efx );
95+ efx_mcdi_free_vis (efx );
96+ efx_remove_interrupts (efx );
97+
98+ return 0 ;
99+ }
100+
101+ /* Context: process, rtnl_lock() held. */
102+ static int ef100_net_open (struct net_device * net_dev )
103+ {
104+ struct efx_nic * efx = netdev_priv (net_dev );
105+ unsigned int allocated_vis ;
106+ int rc ;
107+
108+ ef100_update_name (efx );
109+ netif_dbg (efx , ifup , net_dev , "opening device on CPU %d\n" ,
110+ raw_smp_processor_id ());
111+
112+ rc = efx_check_disabled (efx );
113+ if (rc )
114+ goto fail ;
115+
116+ rc = efx_probe_interrupts (efx );
117+ if (rc )
118+ goto fail ;
119+
120+ rc = efx_set_channels (efx );
121+ if (rc )
122+ goto fail ;
123+
124+ rc = efx_mcdi_free_vis (efx );
125+ if (rc )
126+ goto fail ;
127+
128+ rc = ef100_alloc_vis (efx , & allocated_vis );
129+ if (rc )
130+ goto fail ;
131+
132+ rc = efx_probe_channels (efx );
133+ if (rc )
134+ return rc ;
135+
136+ rc = ef100_remap_bar (efx , allocated_vis );
137+ if (rc )
138+ goto fail ;
139+
140+ efx_init_napi (efx );
141+
142+ rc = efx_nic_init_interrupt (efx );
143+ if (rc )
144+ goto fail ;
145+ efx_set_interrupt_affinity (efx );
146+
147+ rc = efx_enable_interrupts (efx );
148+ if (rc )
149+ goto fail ;
150+
151+ /* in case the MC rebooted while we were stopped, consume the change
152+ * to the warm reboot count
153+ */
154+ (void ) efx_mcdi_poll_reboot (efx );
155+
156+ efx_start_all (efx );
157+
158+ /* Link state detection is normally event-driven; we have
159+ * to poll now because we could have missed a change
160+ */
161+ mutex_lock (& efx -> mac_lock );
162+ if (efx_mcdi_phy_poll (efx ))
163+ efx_link_status_changed (efx );
164+ mutex_unlock (& efx -> mac_lock );
165+
166+ return 0 ;
167+
168+ fail :
169+ ef100_net_stop (net_dev );
170+ return rc ;
171+ }
172+
32173/* Initiate a packet transmission. We use one channel per CPU
33174 * (sharing when we have more CPUs than channels).
34175 *
@@ -64,6 +205,8 @@ static netdev_tx_t ef100_hard_start_xmit(struct sk_buff *skb,
64205}
65206
66207static const struct net_device_ops ef100_netdev_ops = {
208+ .ndo_open = ef100_net_open ,
209+ .ndo_stop = ef100_net_stop ,
67210 .ndo_start_xmit = ef100_hard_start_xmit ,
68211};
69212
0 commit comments