Skip to content

Commit 6b1f8ed

Browse files
committed
Merge branch 's390-next'
Julian Wiedmann says: ==================== s390/net: updates 2017-10-18 please apply some additional robustness fixes and cleanups for 4.15. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 0843c09 + 52c44d2 commit 6b1f8ed

File tree

8 files changed

+85
-190
lines changed

8 files changed

+85
-190
lines changed

drivers/s390/net/fsm.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,7 @@ fsm_addtimer(fsm_timer *this, int millisec, int event, void *arg)
170170
this->fi->name, this, millisec);
171171
#endif
172172

173-
init_timer(&this->tl);
174-
this->tl.function = (void *)fsm_expire_timer;
175-
this->tl.data = (long)this;
173+
setup_timer(&this->tl, (void *)fsm_expire_timer, (long)this);
176174
this->expire_event = event;
177175
this->event_arg = arg;
178176
this->tl.expires = jiffies + (millisec * HZ) / 1000;
@@ -191,9 +189,7 @@ fsm_modtimer(fsm_timer *this, int millisec, int event, void *arg)
191189
#endif
192190

193191
del_timer(&this->tl);
194-
init_timer(&this->tl);
195-
this->tl.function = (void *)fsm_expire_timer;
196-
this->tl.data = (long)this;
192+
setup_timer(&this->tl, (void *)fsm_expire_timer, (long)this);
197193
this->expire_event = event;
198194
this->event_arg = arg;
199195
this->tl.expires = jiffies + (millisec * HZ) / 1000;

drivers/s390/net/qeth_core.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -231,20 +231,6 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
231231
#define QETH_IDX_FUNC_LEVEL_OSD 0x0101
232232
#define QETH_IDX_FUNC_LEVEL_IQD 0x4108
233233

234-
#define QETH_MODELLIST_ARRAY \
235-
{{0x1731, 0x01, 0x1732, QETH_CARD_TYPE_OSD, QETH_MAX_QUEUES, 0}, \
236-
{0x1731, 0x05, 0x1732, QETH_CARD_TYPE_IQD, QETH_MAX_QUEUES, 0x103}, \
237-
{0x1731, 0x06, 0x1732, QETH_CARD_TYPE_OSN, QETH_MAX_QUEUES, 0}, \
238-
{0x1731, 0x02, 0x1732, QETH_CARD_TYPE_OSM, QETH_MAX_QUEUES, 0}, \
239-
{0x1731, 0x02, 0x1732, QETH_CARD_TYPE_OSX, QETH_MAX_QUEUES, 0}, \
240-
{0, 0, 0, 0, 0, 0} }
241-
#define QETH_CU_TYPE_IND 0
242-
#define QETH_CU_MODEL_IND 1
243-
#define QETH_DEV_TYPE_IND 2
244-
#define QETH_DEV_MODEL_IND 3
245-
#define QETH_QUEUE_NO_IND 4
246-
#define QETH_MULTICAST_IND 5
247-
248234
#define QETH_REAL_CARD 1
249235
#define QETH_VLAN_CARD 2
250236
#define QETH_BUFSIZE 4096
@@ -998,7 +984,7 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *,
998984
__u16, __u16,
999985
enum qeth_prot_versions);
1000986
int qeth_set_features(struct net_device *, netdev_features_t);
1001-
int qeth_recover_features(struct net_device *);
987+
void qeth_recover_features(struct net_device *dev);
1002988
netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t);
1003989
int qeth_vm_request_mac(struct qeth_card *card);
1004990
int qeth_push_hdr(struct sk_buff *skb, struct qeth_hdr **hdr, unsigned int len);

drivers/s390/net/qeth_core_main.c

Lines changed: 66 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ EXPORT_SYMBOL_GPL(qeth_core_header_cache);
5252
static struct kmem_cache *qeth_qdio_outbuf_cache;
5353

5454
static struct device *qeth_core_root_dev;
55-
static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY;
5655
static struct lock_class_key qdio_out_skb_queue_key;
5756
static struct mutex qeth_mod_mutex;
5857

@@ -1386,6 +1385,7 @@ static void qeth_init_qdio_info(struct qeth_card *card)
13861385
QETH_DBF_TEXT(SETUP, 4, "intqdinf");
13871386
atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
13881387
/* inbound */
1388+
card->qdio.no_in_queues = 1;
13891389
card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
13901390
if (card->info.type == QETH_CARD_TYPE_IQD)
13911391
card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT;
@@ -1519,34 +1519,17 @@ static struct qeth_card *qeth_alloc_card(void)
15191519
return NULL;
15201520
}
15211521

1522-
static int qeth_determine_card_type(struct qeth_card *card)
1522+
static void qeth_determine_card_type(struct qeth_card *card)
15231523
{
1524-
int i = 0;
1525-
15261524
QETH_DBF_TEXT(SETUP, 2, "detcdtyp");
15271525

15281526
card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
15291527
card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1530-
while (known_devices[i][QETH_DEV_MODEL_IND]) {
1531-
if ((CARD_RDEV(card)->id.dev_type ==
1532-
known_devices[i][QETH_DEV_TYPE_IND]) &&
1533-
(CARD_RDEV(card)->id.dev_model ==
1534-
known_devices[i][QETH_DEV_MODEL_IND])) {
1535-
card->info.type = known_devices[i][QETH_DEV_MODEL_IND];
1536-
card->qdio.no_out_queues =
1537-
known_devices[i][QETH_QUEUE_NO_IND];
1538-
card->qdio.no_in_queues = 1;
1539-
card->info.is_multicast_different =
1540-
known_devices[i][QETH_MULTICAST_IND];
1541-
qeth_update_from_chp_desc(card);
1542-
return 0;
1543-
}
1544-
i++;
1545-
}
1546-
card->info.type = QETH_CARD_TYPE_UNKNOWN;
1547-
dev_err(&card->gdev->dev, "The adapter hardware is of an "
1548-
"unknown type\n");
1549-
return -ENOENT;
1528+
card->info.type = CARD_RDEV(card)->id.driver_info;
1529+
card->qdio.no_out_queues = QETH_MAX_QUEUES;
1530+
if (card->info.type == QETH_CARD_TYPE_IQD)
1531+
card->info.is_multicast_different = 0x0103;
1532+
qeth_update_from_chp_desc(card);
15501533
}
15511534

15521535
static int qeth_clear_channel(struct qeth_channel *channel)
@@ -2090,7 +2073,6 @@ int qeth_send_control_data(struct qeth_card *card, int len,
20902073
spin_lock_irqsave(&card->lock, flags);
20912074
list_add_tail(&reply->list, &card->cmd_waiter_list);
20922075
spin_unlock_irqrestore(&card->lock, flags);
2093-
QETH_DBF_HEX(CTRL, 2, iob->data, QETH_DBF_CTRL_LEN);
20942076

20952077
while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
20962078
qeth_prepare_control_data(card, len, iob);
@@ -2233,23 +2215,15 @@ static int qeth_cm_setup(struct qeth_card *card)
22332215
static int qeth_get_initial_mtu_for_card(struct qeth_card *card)
22342216
{
22352217
switch (card->info.type) {
2236-
case QETH_CARD_TYPE_UNKNOWN:
2237-
return 1500;
22382218
case QETH_CARD_TYPE_IQD:
22392219
return card->info.max_mtu;
22402220
case QETH_CARD_TYPE_OSD:
2241-
switch (card->info.link_type) {
2242-
case QETH_LINK_TYPE_HSTR:
2243-
case QETH_LINK_TYPE_LANE_TR:
2244-
return 2000;
2245-
default:
2246-
return card->options.layer2 ? 1500 : 1492;
2247-
}
2248-
case QETH_CARD_TYPE_OSM:
22492221
case QETH_CARD_TYPE_OSX:
2250-
return card->options.layer2 ? 1500 : 1492;
2222+
if (!card->options.layer2)
2223+
return ETH_DATA_LEN - 8; /* L3: allow for LLC + SNAP */
2224+
/* fall through */
22512225
default:
2252-
return 1500;
2226+
return ETH_DATA_LEN;
22532227
}
22542228
}
22552229

@@ -2279,7 +2253,6 @@ static int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
22792253
return ((mtu >= 576) &&
22802254
(mtu <= card->info.max_mtu));
22812255
case QETH_CARD_TYPE_OSN:
2282-
case QETH_CARD_TYPE_UNKNOWN:
22832256
default:
22842257
return 1;
22852258
}
@@ -5196,49 +5169,27 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
51965169
}
51975170
EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
51985171

5199-
static int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer,
5200-
struct qdio_buffer_element *element,
5201-
struct sk_buff **pskb, int offset, int *pfrag,
5202-
int data_len)
5172+
static void qeth_create_skb_frag(struct qdio_buffer_element *element,
5173+
struct sk_buff *skb, int offset, int data_len)
52035174
{
52045175
struct page *page = virt_to_page(element->addr);
5205-
if (*pskb == NULL) {
5206-
if (qethbuffer->rx_skb) {
5207-
/* only if qeth_card.options.cq == QETH_CQ_ENABLED */
5208-
*pskb = qethbuffer->rx_skb;
5209-
qethbuffer->rx_skb = NULL;
5210-
} else {
5211-
*pskb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
5212-
if (!(*pskb))
5213-
return -ENOMEM;
5214-
}
5176+
unsigned int next_frag;
52155177

5216-
skb_reserve(*pskb, ETH_HLEN);
5217-
if (data_len <= QETH_RX_PULL_LEN) {
5218-
skb_put_data(*pskb, element->addr + offset, data_len);
5219-
} else {
5220-
get_page(page);
5221-
skb_put_data(*pskb, element->addr + offset,
5222-
QETH_RX_PULL_LEN);
5223-
skb_fill_page_desc(*pskb, *pfrag, page,
5224-
offset + QETH_RX_PULL_LEN,
5225-
data_len - QETH_RX_PULL_LEN);
5226-
(*pskb)->data_len += data_len - QETH_RX_PULL_LEN;
5227-
(*pskb)->len += data_len - QETH_RX_PULL_LEN;
5228-
(*pskb)->truesize += data_len - QETH_RX_PULL_LEN;
5229-
(*pfrag)++;
5230-
}
5231-
} else {
5232-
get_page(page);
5233-
skb_fill_page_desc(*pskb, *pfrag, page, offset, data_len);
5234-
(*pskb)->data_len += data_len;
5235-
(*pskb)->len += data_len;
5236-
(*pskb)->truesize += data_len;
5237-
(*pfrag)++;
5238-
}
5178+
/* first fill the linear space */
5179+
if (!skb->len) {
5180+
unsigned int linear = min(data_len, skb_tailroom(skb));
52395181

5182+
skb_put_data(skb, element->addr + offset, linear);
5183+
data_len -= linear;
5184+
if (!data_len)
5185+
return;
5186+
offset += linear;
5187+
/* fall through to add page frag for remaining data */
5188+
}
52405189

5241-
return 0;
5190+
next_frag = skb_shinfo(skb)->nr_frags;
5191+
get_page(page);
5192+
skb_add_rx_frag(skb, next_frag, page, offset, data_len, data_len);
52425193
}
52435194

52445195
static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
@@ -5254,22 +5205,19 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
52545205
struct qdio_buffer_element *element = *__element;
52555206
struct qdio_buffer *buffer = qethbuffer->buffer;
52565207
int offset = *__offset;
5257-
struct sk_buff *skb = NULL;
5208+
struct sk_buff *skb;
52585209
int skb_len = 0;
52595210
void *data_ptr;
52605211
int data_len;
52615212
int headroom = 0;
52625213
int use_rx_sg = 0;
5263-
int frag = 0;
52645214

52655215
/* qeth_hdr must not cross element boundaries */
5266-
if (element->length < offset + sizeof(struct qeth_hdr)) {
5216+
while (element->length < offset + sizeof(struct qeth_hdr)) {
52675217
if (qeth_is_last_sbale(element))
52685218
return NULL;
52695219
element++;
52705220
offset = 0;
5271-
if (element->length < sizeof(struct qeth_hdr))
5272-
return NULL;
52735221
}
52745222
*hdr = element->addr + offset;
52755223

@@ -5296,27 +5244,32 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
52965244
if (((skb_len >= card->options.rx_sg_cb) &&
52975245
(!(card->info.type == QETH_CARD_TYPE_OSN)) &&
52985246
(!atomic_read(&card->force_alloc_skb))) ||
5299-
(card->options.cq == QETH_CQ_ENABLED)) {
5247+
(card->options.cq == QETH_CQ_ENABLED))
53005248
use_rx_sg = 1;
5249+
5250+
if (use_rx_sg && qethbuffer->rx_skb) {
5251+
/* QETH_CQ_ENABLED only: */
5252+
skb = qethbuffer->rx_skb;
5253+
qethbuffer->rx_skb = NULL;
53015254
} else {
5302-
skb = dev_alloc_skb(skb_len + headroom);
5303-
if (!skb)
5304-
goto no_mem;
5305-
if (headroom)
5306-
skb_reserve(skb, headroom);
5255+
unsigned int linear = (use_rx_sg) ? QETH_RX_PULL_LEN : skb_len;
5256+
5257+
skb = dev_alloc_skb(linear + headroom);
53075258
}
5259+
if (!skb)
5260+
goto no_mem;
5261+
if (headroom)
5262+
skb_reserve(skb, headroom);
53085263

53095264
data_ptr = element->addr + offset;
53105265
while (skb_len) {
53115266
data_len = min(skb_len, (int)(element->length - offset));
53125267
if (data_len) {
5313-
if (use_rx_sg) {
5314-
if (qeth_create_skb_frag(qethbuffer, element,
5315-
&skb, offset, &frag, data_len))
5316-
goto no_mem;
5317-
} else {
5268+
if (use_rx_sg)
5269+
qeth_create_skb_frag(element, skb, offset,
5270+
data_len);
5271+
else
53185272
skb_put_data(skb, data_ptr, data_len);
5319-
}
53205273
}
53215274
skb_len -= data_len;
53225275
if (skb_len) {
@@ -5416,7 +5369,7 @@ int qeth_poll(struct napi_struct *napi, int budget)
54165369
}
54175370
}
54185371

5419-
napi_complete(napi);
5372+
napi_complete_done(napi, work_done);
54205373
if (qdio_start_irq(card->data.ccwdev, 0))
54215374
napi_schedule(&card->napi);
54225375
out:
@@ -5724,11 +5677,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
57245677
gdev->cdev[1]->handler = qeth_irq;
57255678
gdev->cdev[2]->handler = qeth_irq;
57265679

5727-
rc = qeth_determine_card_type(card);
5728-
if (rc) {
5729-
QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
5730-
goto err_card;
5731-
}
5680+
qeth_determine_card_type(card);
57325681
rc = qeth_setup_card(card);
57335682
if (rc) {
57345683
QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
@@ -6403,32 +6352,29 @@ static int qeth_set_ipa_tso(struct qeth_card *card, int on)
64036352
return rc;
64046353
}
64056354

6406-
/* try to restore device features on a device after recovery */
6407-
int qeth_recover_features(struct net_device *dev)
6355+
#define QETH_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_TSO)
6356+
6357+
/**
6358+
* qeth_recover_features() - Restore device features after recovery
6359+
* @dev: the recovering net_device
6360+
*
6361+
* Caller must hold rtnl lock.
6362+
*/
6363+
void qeth_recover_features(struct net_device *dev)
64086364
{
6365+
netdev_features_t features = dev->features;
64096366
struct qeth_card *card = dev->ml_priv;
6410-
netdev_features_t recover = dev->features;
64116367

6412-
if (recover & NETIF_F_IP_CSUM) {
6413-
if (qeth_set_ipa_csum(card, 1, IPA_OUTBOUND_CHECKSUM))
6414-
recover ^= NETIF_F_IP_CSUM;
6415-
}
6416-
if (recover & NETIF_F_RXCSUM) {
6417-
if (qeth_set_ipa_csum(card, 1, IPA_INBOUND_CHECKSUM))
6418-
recover ^= NETIF_F_RXCSUM;
6419-
}
6420-
if (recover & NETIF_F_TSO) {
6421-
if (qeth_set_ipa_tso(card, 1))
6422-
recover ^= NETIF_F_TSO;
6423-
}
6424-
6425-
if (recover == dev->features)
6426-
return 0;
6368+
/* force-off any feature that needs an IPA sequence.
6369+
* netdev_update_features() will restart them.
6370+
*/
6371+
dev->features &= ~QETH_HW_FEATURES;
6372+
netdev_update_features(dev);
64276373

6374+
if (features == dev->features)
6375+
return;
64286376
dev_warn(&card->gdev->dev,
64296377
"Device recovery failed to restore all offload features\n");
6430-
dev->features = recover;
6431-
return -EIO;
64326378
}
64336379
EXPORT_SYMBOL_GPL(qeth_recover_features);
64346380

@@ -6485,8 +6431,7 @@ netdev_features_t qeth_fix_features(struct net_device *dev,
64856431
/* if the card isn't up, remove features that require hw changes */
64866432
if (card->state == CARD_STATE_DOWN ||
64876433
card->state == CARD_STATE_RECOVER)
6488-
features = features & ~(NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
6489-
NETIF_F_TSO);
6434+
features &= ~QETH_HW_FEATURES;
64906435
QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
64916436
return features;
64926437
}

drivers/s390/net/qeth_core_mpc.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ extern unsigned char IPA_PDU_HEADER[];
4444
#define IPA_CMD_PRIM_VERSION_NO 0x01
4545

4646
enum qeth_card_types {
47-
QETH_CARD_TYPE_UNKNOWN = 0,
4847
QETH_CARD_TYPE_OSD = 1,
4948
QETH_CARD_TYPE_IQD = 5,
5049
QETH_CARD_TYPE_OSN = 6,

drivers/s390/net/qeth_core_sys.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,8 @@ static ssize_t qeth_dev_isolation_store(struct device *dev,
475475
return -EINVAL;
476476

477477
mutex_lock(&card->conf_mutex);
478-
/* check for unknown, too, in case we do not yet know who we are */
479478
if (card->info.type != QETH_CARD_TYPE_OSD &&
480-
card->info.type != QETH_CARD_TYPE_OSX &&
481-
card->info.type != QETH_CARD_TYPE_UNKNOWN) {
479+
card->info.type != QETH_CARD_TYPE_OSX) {
482480
rc = -EOPNOTSUPP;
483481
dev_err(&card->gdev->dev, "Adapter does not "
484482
"support QDIO data connection isolation\n");

0 commit comments

Comments
 (0)