Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/ena/ena.c
Show First 20 Lines • Show All 345 Lines • ▼ Show 20 Lines | ena_probe(device_t dev) | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
static int | static int | ||||
ena_change_mtu(if_t ifp, int new_mtu) | ena_change_mtu(if_t ifp, int new_mtu) | ||||
{ | { | ||||
struct ena_adapter *adapter = if_getsoftc(ifp); | struct ena_adapter *adapter = if_getsoftc(ifp); | ||||
struct ena_com_dev_get_features_ctx get_feat_ctx; | int rc; | ||||
int rc, old_mtu, max_frame; | |||||
rc = ena_com_get_dev_attr_feat(adapter->ena_dev, &get_feat_ctx); | if ((new_mtu > adapter->max_mtu) || (new_mtu < ENA_MIN_MTU)) { | ||||
if (unlikely(rc != 0)) { | device_printf(adapter->pdev, "Invalid MTU setting. " | ||||
device_printf(adapter->pdev, | "new_mtu: %d max mtu: %d min mtu: %d\n", | ||||
"Cannot get attribute for ena device\n"); | new_mtu, adapter->max_mtu, ENA_MIN_MTU); | ||||
return (ENXIO); | return (EINVAL); | ||||
} | } | ||||
/* Save old MTU in case of fail */ | rc = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu); | ||||
old_mtu = if_getmtu(ifp); | if (likely(rc == 0)) { | ||||
ena_trace(ENA_DBG, "set MTU to %d\n", new_mtu); | |||||
/* Change MTU and calculate max frame */ | |||||
if_setmtu(ifp, new_mtu); | if_setmtu(ifp, new_mtu); | ||||
max_frame = ETHER_MAX_FRAME(ifp, ETHERTYPE_VLAN, 1); | } else { | ||||
device_printf(adapter->pdev, "Failed to set MTU to %d\n", | |||||
if (unlikely((new_mtu < ENA_MIN_FRAME_LEN) || | new_mtu); | ||||
(new_mtu > get_feat_ctx.dev_attr.max_mtu) || | |||||
(max_frame > ENA_MAX_FRAME_LEN))) { | |||||
device_printf(adapter->pdev, "Invalid MTU setting. " | |||||
"new_mtu: %d\n", new_mtu); | |||||
goto error; | |||||
} | } | ||||
rc = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu); | return (rc); | ||||
if (rc != 0) | |||||
goto error; | |||||
return (0); | |||||
error: | |||||
if_setmtu(ifp, old_mtu); | |||||
return (EINVAL); | |||||
} | } | ||||
static inline void | static inline void | ||||
ena_alloc_counters(counter_u64_t *begin, int size) | ena_alloc_counters(counter_u64_t *begin, int size) | ||||
{ | { | ||||
counter_u64_t *end = (counter_u64_t *)((char *)begin + size); | counter_u64_t *end = (counter_u64_t *)((char *)begin + size); | ||||
for (; begin < end; ++begin) | for (; begin < end; ++begin) | ||||
▲ Show 20 Lines • Show All 3,303 Lines • ▼ Show 20 Lines | memcpy(adapter->mac_addr, get_feat_ctx.dev_attr.mac_addr, | ||||
ETHER_ADDR_LEN); | ETHER_ADDR_LEN); | ||||
/* calculate IO queue number to create */ | /* calculate IO queue number to create */ | ||||
io_queue_num = ena_calc_io_queue_num(adapter, &get_feat_ctx); | io_queue_num = ena_calc_io_queue_num(adapter, &get_feat_ctx); | ||||
ENA_ASSERT(io_queue_num > 0, "Invalid queue number: %d\n", | ENA_ASSERT(io_queue_num > 0, "Invalid queue number: %d\n", | ||||
io_queue_num); | io_queue_num); | ||||
adapter->num_queues = io_queue_num; | adapter->num_queues = io_queue_num; | ||||
adapter->max_mtu = get_feat_ctx.dev_attr.max_mtu; | |||||
/* calculatre ring sizes */ | /* calculatre ring sizes */ | ||||
queue_size = ena_calc_queue_size(adapter,&tx_sgl_size, | queue_size = ena_calc_queue_size(adapter,&tx_sgl_size, | ||||
&rx_sgl_size, &get_feat_ctx); | &rx_sgl_size, &get_feat_ctx); | ||||
if (unlikely((queue_size <= 0) || (io_queue_num <= 0))) { | if (unlikely((queue_size <= 0) || (io_queue_num <= 0))) { | ||||
rc = ENA_COM_FAULT; | rc = ENA_COM_FAULT; | ||||
goto err_com_free; | goto err_com_free; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 240 Lines • Show Last 20 Lines |