Skip to content

Commit 4d154fa

Browse files
committed
Merge: [s390] [IBM 9.6 FEAT] Upgrade the QETH driver to latest from upstream
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/5566 JIRA: https://issues.redhat.com/browse/RHEL-50786 Tested: by IBM Build-Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=65307356 Commits: 2210c54 net/iucv: fix virtual vs physical address confusion b4ea9b6 net/iucv: fix the allocation size of iucv_path_table array 9eda38d net/af_iucv: fix virtual vs physical address confusion 4e8477a s390/iucv: fix receive buffer virtual vs physical address confusion 525b7d2 s390/qeth: use new address translation helpers 9608142 s390/lcs: use new address translation helpers 6b9875a s390/ctcm: use new address translation helpers 2aca9ea s390/iucv: use new address translation helpers 4452e8e s390/iucv: Provide iucv_alloc_device() / iucv_release_device() 968bfb5 s390/netiucv: Make use of iucv_alloc_device() 3bbde49 s390/smsgiucv_app: Make use of iucv_alloc_device() 0124fb0 s390/iucv: Fix vargs handling in iucv_alloc_device() Signed-off-by: Mete Durlu <mdurlu@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Rado Vrbovsky <rvrbovsk@redhat.com>
2 parents 824f419 + 757ab8f commit 4d154fa

File tree

10 files changed

+102
-85
lines changed

10 files changed

+102
-85
lines changed

drivers/s390/net/ctcm_fsms.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,7 +1325,7 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
13251325
clear_normalized_cda(&ch->ccw[1]);
13261326

13271327
CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
1328-
(void *)(unsigned long)ch->ccw[1].cda,
1328+
(void *)(u64)dma32_to_u32(ch->ccw[1].cda),
13291329
ch->trans_skb->data);
13301330
ch->ccw[1].count = ch->max_bufsize;
13311331

@@ -1340,7 +1340,7 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
13401340
}
13411341

13421342
CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
1343-
(void *)(unsigned long)ch->ccw[1].cda,
1343+
(void *)(u64)dma32_to_u32(ch->ccw[1].cda),
13441344
ch->trans_skb->data);
13451345

13461346
ch->ccw[1].count = ch->trans_skb->len;

drivers/s390/net/ctcm_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1389,7 +1389,7 @@ static int add_channel(struct ccw_device *cdev, enum ctcm_channel_types type,
13891389
ch->ccw[15].cmd_code = CCW_CMD_WRITE;
13901390
ch->ccw[15].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
13911391
ch->ccw[15].count = TH_HEADER_LENGTH;
1392-
ch->ccw[15].cda = virt_to_phys(ch->discontact_th);
1392+
ch->ccw[15].cda = virt_to_dma32(ch->discontact_th);
13931393

13941394
ch->ccw[16].cmd_code = CCW_CMD_NOOP;
13951395
ch->ccw[16].flags = CCW_FLAG_SLI;

drivers/s390/net/ctcm_mpc.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,57 +1708,57 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
17081708
ch->ccw[9].cmd_code = CCW_CMD_WRITE;
17091709
ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17101710
ch->ccw[9].count = TH_HEADER_LENGTH;
1711-
ch->ccw[9].cda = virt_to_phys(ch->xid_th);
1711+
ch->ccw[9].cda = virt_to_dma32(ch->xid_th);
17121712

17131713
if (ch->xid == NULL)
17141714
goto done;
17151715
ch->ccw[10].cmd_code = CCW_CMD_WRITE;
17161716
ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17171717
ch->ccw[10].count = XID2_LENGTH;
1718-
ch->ccw[10].cda = virt_to_phys(ch->xid);
1718+
ch->ccw[10].cda = virt_to_dma32(ch->xid);
17191719

17201720
ch->ccw[11].cmd_code = CCW_CMD_READ;
17211721
ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17221722
ch->ccw[11].count = TH_HEADER_LENGTH;
1723-
ch->ccw[11].cda = virt_to_phys(ch->rcvd_xid_th);
1723+
ch->ccw[11].cda = virt_to_dma32(ch->rcvd_xid_th);
17241724

17251725
ch->ccw[12].cmd_code = CCW_CMD_READ;
17261726
ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17271727
ch->ccw[12].count = XID2_LENGTH;
1728-
ch->ccw[12].cda = virt_to_phys(ch->rcvd_xid);
1728+
ch->ccw[12].cda = virt_to_dma32(ch->rcvd_xid);
17291729

17301730
ch->ccw[13].cmd_code = CCW_CMD_READ;
1731-
ch->ccw[13].cda = virt_to_phys(ch->rcvd_xid_id);
1731+
ch->ccw[13].cda = virt_to_dma32(ch->rcvd_xid_id);
17321732

17331733
} else { /* side == YSIDE : mpc_action_yside_xid */
17341734
ch->ccw[9].cmd_code = CCW_CMD_READ;
17351735
ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17361736
ch->ccw[9].count = TH_HEADER_LENGTH;
1737-
ch->ccw[9].cda = virt_to_phys(ch->rcvd_xid_th);
1737+
ch->ccw[9].cda = virt_to_dma32(ch->rcvd_xid_th);
17381738

17391739
ch->ccw[10].cmd_code = CCW_CMD_READ;
17401740
ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17411741
ch->ccw[10].count = XID2_LENGTH;
1742-
ch->ccw[10].cda = virt_to_phys(ch->rcvd_xid);
1742+
ch->ccw[10].cda = virt_to_dma32(ch->rcvd_xid);
17431743

17441744
if (ch->xid_th == NULL)
17451745
goto done;
17461746
ch->ccw[11].cmd_code = CCW_CMD_WRITE;
17471747
ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17481748
ch->ccw[11].count = TH_HEADER_LENGTH;
1749-
ch->ccw[11].cda = virt_to_phys(ch->xid_th);
1749+
ch->ccw[11].cda = virt_to_dma32(ch->xid_th);
17501750

17511751
if (ch->xid == NULL)
17521752
goto done;
17531753
ch->ccw[12].cmd_code = CCW_CMD_WRITE;
17541754
ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
17551755
ch->ccw[12].count = XID2_LENGTH;
1756-
ch->ccw[12].cda = virt_to_phys(ch->xid);
1756+
ch->ccw[12].cda = virt_to_dma32(ch->xid);
17571757

17581758
if (ch->xid_id == NULL)
17591759
goto done;
17601760
ch->ccw[13].cmd_code = CCW_CMD_WRITE;
1761-
ch->ccw[13].cda = virt_to_phys(ch->xid_id);
1761+
ch->ccw[13].cda = virt_to_dma32(ch->xid_id);
17621762

17631763
}
17641764
ch->ccw[13].flags = CCW_FLAG_SLI | CCW_FLAG_CC;

drivers/s390/net/lcs.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ lcs_setup_read_ccws(struct lcs_card *card)
218218
* we do not need to do set_normalized_cda.
219219
*/
220220
card->read.ccws[cnt].cda =
221-
(__u32)virt_to_phys(card->read.iob[cnt].data);
221+
virt_to_dma32(card->read.iob[cnt].data);
222222
((struct lcs_header *)
223223
card->read.iob[cnt].data)->offset = LCS_ILLEGAL_OFFSET;
224224
card->read.iob[cnt].callback = lcs_get_frames_cb;
@@ -230,8 +230,7 @@ lcs_setup_read_ccws(struct lcs_card *card)
230230
card->read.ccws[LCS_NUM_BUFFS - 1].flags |= CCW_FLAG_SUSPEND;
231231
/* Last ccw is a tic (transfer in channel). */
232232
card->read.ccws[LCS_NUM_BUFFS].cmd_code = LCS_CCW_TRANSFER;
233-
card->read.ccws[LCS_NUM_BUFFS].cda =
234-
(__u32)virt_to_phys(card->read.ccws);
233+
card->read.ccws[LCS_NUM_BUFFS].cda = virt_to_dma32(card->read.ccws);
235234
/* Setg initial state of the read channel. */
236235
card->read.state = LCS_CH_STATE_INIT;
237236

@@ -273,12 +272,11 @@ lcs_setup_write_ccws(struct lcs_card *card)
273272
* we do not need to do set_normalized_cda.
274273
*/
275274
card->write.ccws[cnt].cda =
276-
(__u32)virt_to_phys(card->write.iob[cnt].data);
275+
virt_to_dma32(card->write.iob[cnt].data);
277276
}
278277
/* Last ccw is a tic (transfer in channel). */
279278
card->write.ccws[LCS_NUM_BUFFS].cmd_code = LCS_CCW_TRANSFER;
280-
card->write.ccws[LCS_NUM_BUFFS].cda =
281-
(__u32)virt_to_phys(card->write.ccws);
279+
card->write.ccws[LCS_NUM_BUFFS].cda = virt_to_dma32(card->write.ccws);
282280
/* Set initial state of the write channel. */
283281
card->read.state = LCS_CH_STATE_INIT;
284282

@@ -1399,7 +1397,7 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
13991397
if ((channel->state != LCS_CH_STATE_INIT) &&
14001398
(irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) &&
14011399
(irb->scsw.cmd.cpa != 0)) {
1402-
index = (struct ccw1 *) __va((addr_t) irb->scsw.cmd.cpa)
1400+
index = (struct ccw1 *)dma32_to_virt(irb->scsw.cmd.cpa)
14031401
- channel->ccws;
14041402
if ((irb->scsw.cmd.actl & SCSW_ACTL_SUSPENDED) ||
14051403
(irb->scsw.cmd.cstat & SCHN_STAT_PCI))

drivers/s390/net/netiucv.c

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,26 +1696,14 @@ static const struct attribute_group *netiucv_attr_groups[] = {
16961696
static int netiucv_register_device(struct net_device *ndev)
16971697
{
16981698
struct netiucv_priv *priv = netdev_priv(ndev);
1699-
struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1699+
struct device *dev;
17001700
int ret;
17011701

17021702
IUCV_DBF_TEXT(trace, 3, __func__);
17031703

1704-
if (dev) {
1705-
dev_set_name(dev, "net%s", ndev->name);
1706-
dev->bus = &iucv_bus;
1707-
dev->parent = iucv_root;
1708-
dev->groups = netiucv_attr_groups;
1709-
/*
1710-
* The release function could be called after the
1711-
* module has been unloaded. It's _only_ task is to
1712-
* free the struct. Therefore, we specify kfree()
1713-
* directly here. (Probably a little bit obfuscating
1714-
* but legitime ...).
1715-
*/
1716-
dev->release = (void (*)(struct device *))kfree;
1717-
dev->driver = &netiucv_driver;
1718-
} else
1704+
dev = iucv_alloc_device(netiucv_attr_groups, &netiucv_driver, NULL,
1705+
"net%s", ndev->name);
1706+
if (!dev)
17191707
return -ENOMEM;
17201708

17211709
ret = device_register(dev);

drivers/s390/net/qeth_core_main.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ static void qeth_setup_ccw(struct ccw1 *ccw, u8 cmd_code, u8 flags, u32 len,
429429
ccw->cmd_code = cmd_code;
430430
ccw->flags = flags | CCW_FLAG_SLI;
431431
ccw->count = len;
432-
ccw->cda = (__u32)virt_to_phys(data);
432+
ccw->cda = virt_to_dma32(data);
433433
}
434434

435435
static int __qeth_issue_next_read(struct qeth_card *card)
@@ -1396,7 +1396,7 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
13961396
qeth_tx_complete_buf(queue, buf, error, budget);
13971397

13981398
for (i = 0; i < queue->max_elements; ++i) {
1399-
void *data = phys_to_virt(buf->buffer->element[i].addr);
1399+
void *data = dma64_to_virt(buf->buffer->element[i].addr);
14001400

14011401
if (__test_and_clear_bit(i, buf->from_kmem_cache) && data)
14021402
kmem_cache_free(qeth_core_header_cache, data);
@@ -2958,8 +2958,8 @@ static int qeth_init_input_buffer(struct qeth_card *card,
29582958
*/
29592959
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
29602960
buf->buffer->element[i].length = PAGE_SIZE;
2961-
buf->buffer->element[i].addr =
2962-
page_to_phys(pool_entry->elements[i]);
2961+
buf->buffer->element[i].addr = u64_to_dma64(
2962+
page_to_phys(pool_entry->elements[i]));
29632963
if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
29642964
buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
29652965
else
@@ -3792,9 +3792,9 @@ static void qeth_qdio_cq_handler(struct qeth_card *card, unsigned int qdio_err,
37923792

37933793
while ((e < QDIO_MAX_ELEMENTS_PER_BUFFER) &&
37943794
buffer->element[e].addr) {
3795-
unsigned long phys_aob_addr = buffer->element[e].addr;
3795+
dma64_t phys_aob_addr = buffer->element[e].addr;
37963796

3797-
qeth_qdio_handle_aob(card, phys_to_virt(phys_aob_addr));
3797+
qeth_qdio_handle_aob(card, dma64_to_virt(phys_aob_addr));
37983798
++e;
37993799
}
38003800
qeth_scrub_qdio_buffer(buffer, QDIO_MAX_ELEMENTS_PER_BUFFER);
@@ -4069,7 +4069,7 @@ static unsigned int qeth_fill_buffer(struct qeth_qdio_out_buffer *buf,
40694069
if (hd_len) {
40704070
is_first_elem = false;
40714071

4072-
buffer->element[element].addr = virt_to_phys(hdr);
4072+
buffer->element[element].addr = virt_to_dma64(hdr);
40734073
buffer->element[element].length = hd_len;
40744074
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
40754075

@@ -4090,7 +4090,7 @@ static unsigned int qeth_fill_buffer(struct qeth_qdio_out_buffer *buf,
40904090
elem_length = min_t(unsigned int, length,
40914091
PAGE_SIZE - offset_in_page(data));
40924092

4093-
buffer->element[element].addr = virt_to_phys(data);
4093+
buffer->element[element].addr = virt_to_dma64(data);
40944094
buffer->element[element].length = elem_length;
40954095
length -= elem_length;
40964096
if (is_first_elem) {
@@ -4120,7 +4120,7 @@ static unsigned int qeth_fill_buffer(struct qeth_qdio_out_buffer *buf,
41204120
elem_length = min_t(unsigned int, length,
41214121
PAGE_SIZE - offset_in_page(data));
41224122

4123-
buffer->element[element].addr = virt_to_phys(data);
4123+
buffer->element[element].addr = virt_to_dma64(data);
41244124
buffer->element[element].length = elem_length;
41254125
buffer->element[element].eflags =
41264126
SBAL_EFLAGS_MIDDLE_FRAG;
@@ -5596,7 +5596,7 @@ static int qeth_extract_skb(struct qeth_card *card,
55965596
offset = 0;
55975597
}
55985598

5599-
hdr = phys_to_virt(element->addr) + offset;
5599+
hdr = dma64_to_virt(element->addr) + offset;
56005600
offset += sizeof(*hdr);
56015601
skb = NULL;
56025602

@@ -5688,7 +5688,7 @@ static int qeth_extract_skb(struct qeth_card *card,
56885688
walk_packet:
56895689
while (skb_len) {
56905690
int data_len = min(skb_len, (int)(element->length - offset));
5691-
char *data = phys_to_virt(element->addr) + offset;
5691+
char *data = dma64_to_virt(element->addr) + offset;
56925692

56935693
skb_len -= data_len;
56945694
offset += data_len;

drivers/s390/net/smsgiucv_app.c

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -156,25 +156,14 @@ static int __init smsgiucv_app_init(void)
156156
if (!MACHINE_IS_VM)
157157
return -ENODEV;
158158

159-
smsg_app_dev = kzalloc(sizeof(*smsg_app_dev), GFP_KERNEL);
160-
if (!smsg_app_dev)
161-
return -ENOMEM;
162-
163159
smsgiucv_drv = driver_find(SMSGIUCV_DRV_NAME, &iucv_bus);
164-
if (!smsgiucv_drv) {
165-
kfree(smsg_app_dev);
160+
if (!smsgiucv_drv)
166161
return -ENODEV;
167-
}
168162

169-
rc = dev_set_name(smsg_app_dev, KMSG_COMPONENT);
170-
if (rc) {
171-
kfree(smsg_app_dev);
172-
goto fail;
173-
}
174-
smsg_app_dev->bus = &iucv_bus;
175-
smsg_app_dev->parent = iucv_root;
176-
smsg_app_dev->release = (void (*)(struct device *)) kfree;
177-
smsg_app_dev->driver = smsgiucv_drv;
163+
smsg_app_dev = iucv_alloc_device(NULL, smsgiucv_drv, NULL, KMSG_COMPONENT);
164+
if (!smsg_app_dev)
165+
return -ENOMEM;
166+
178167
rc = device_register(smsg_app_dev);
179168
if (rc) {
180169
put_device(smsg_app_dev);

include/net/iucv/iucv.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include <linux/types.h>
3232
#include <linux/slab.h>
33+
#include <asm/dma-types.h>
3334
#include <asm/debug.h>
3435

3536
/*
@@ -76,13 +77,19 @@
7677
* and iucv_message_reply if IUCV_IPBUFLST or IUCV_IPANSLST are used.
7778
*/
7879
struct iucv_array {
79-
u32 address;
80+
dma32_t address;
8081
u32 length;
8182
} __attribute__ ((aligned (8)));
8283

8384
extern struct bus_type iucv_bus;
8485
extern struct device *iucv_root;
8586

87+
struct device_driver;
88+
89+
struct device *iucv_alloc_device(const struct attribute_group **attrs,
90+
struct device_driver *driver, void *priv,
91+
const char *fmt, ...) __printf(4, 5);
92+
8693
/*
8794
* struct iucv_path
8895
* pathid: 16 bit path identification

net/iucv/af_iucv.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,13 +1060,12 @@ static int iucv_sock_sendmsg(struct socket *sock, struct msghdr *msg,
10601060
int i;
10611061

10621062
/* skip iucv_array lying in the headroom */
1063-
iba[0].address = (u32)(addr_t)skb->data;
1063+
iba[0].address = virt_to_dma32(skb->data);
10641064
iba[0].length = (u32)skb_headlen(skb);
10651065
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
10661066
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
10671067

1068-
iba[i + 1].address =
1069-
(u32)(addr_t)skb_frag_address(frag);
1068+
iba[i + 1].address = virt_to_dma32(skb_frag_address(frag));
10701069
iba[i + 1].length = (u32)skb_frag_size(frag);
10711070
}
10721071
err = pr_iucv->message_send(iucv->path, &txmsg,
@@ -1162,13 +1161,12 @@ static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
11621161
struct iucv_array *iba = (struct iucv_array *)skb->head;
11631162
int i;
11641163

1165-
iba[0].address = (u32)(addr_t)skb->data;
1164+
iba[0].address = virt_to_dma32(skb->data);
11661165
iba[0].length = (u32)skb_headlen(skb);
11671166
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
11681167
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
11691168

1170-
iba[i + 1].address =
1171-
(u32)(addr_t)skb_frag_address(frag);
1169+
iba[i + 1].address = virt_to_dma32(skb_frag_address(frag));
11721170
iba[i + 1].length = (u32)skb_frag_size(frag);
11731171
}
11741172
rc = pr_iucv->message_receive(path, msg,

0 commit comments

Comments
 (0)