Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70deb016 authored by Hans Wippel's avatar Hans Wippel Committed by David S. Miller
Browse files

qeth: omit outbound queue 3 for unicast packets in Priority Queuing on HiperSockets



On HiperSockets only outbound queues 0 to 2 are available for unicast
packets. Current Priority Queuing implementation in the qeth driver puts
outgoing packets in outbound queues 0 to 3.

This puts outgoing unicast packets into outbound queue 2 instead of
outbound queue 3 when using Priority Queuing on a HiperSocket.
Additionally, the default outbound queue cannot be set to outbound queue 3
on HiperSockets.

Signed-off-by: default avatarHans Wippel <hwippel@linux.vnet.ibm.com>
Signed-off-by: default avatarUrsula Braun <ubraun@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6c7cd712
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -3748,6 +3748,14 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev,
}
EXPORT_SYMBOL_GPL(qeth_qdio_output_handler);

/* We cannot use outbound queue 3 for unicast packets on HiperSockets */
static inline int qeth_cut_iqd_prio(struct qeth_card *card, int queue_num)
{
	if ((card->info.type == QETH_CARD_TYPE_IQD) && (queue_num == 3))
		return 2;
	return queue_num;
}

/**
 * Note: Function assumes that we have 4 outbound queues.
 */
@@ -3775,9 +3783,9 @@ int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
			return card->qdio.default_out_queue;
		}
		if (card->qdio.do_prio_queueing == QETH_PRIO_Q_ING_PREC)
			return ~tos >> 6 & 3;
			return qeth_cut_iqd_prio(card, ~tos >> 6 & 3);
		if (tos & IPTOS_MINCOST)
			return 3;
			return qeth_cut_iqd_prio(card, 3);
		if (tos & IPTOS_RELIABILITY)
			return 2;
		if (tos & IPTOS_THROUGHPUT)
@@ -3788,11 +3796,12 @@ int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
	case QETH_PRIO_Q_ING_SKB:
		if (skb->priority > 5)
			return 0;
		return ~skb->priority >> 1 & 3;
		return qeth_cut_iqd_prio(card, ~skb->priority >> 1 & 3);
	case QETH_PRIO_Q_ING_VLAN:
		tci = &((struct ethhdr *)skb->data)->h_proto;
		if (*tci == ETH_P_8021Q)
			return ~*(tci + 1) >> (VLAN_PRIO_SHIFT + 1) & 3;
			return qeth_cut_iqd_prio(card, ~*(tci + 1) >>
			(VLAN_PRIO_SHIFT + 1) & 3);
		break;
	default:
		break;
+4 −0
Original line number Diff line number Diff line
@@ -243,6 +243,10 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev,
		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
		card->qdio.default_out_queue = 2;
	} else if (sysfs_streq(buf, "no_prio_queueing:3")) {
		if (card->info.type == QETH_CARD_TYPE_IQD) {
			rc = -EPERM;
			goto out;
		}
		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
		card->qdio.default_out_queue = 3;
	} else if (sysfs_streq(buf, "no_prio_queueing")) {