The maximum entries for H_SEND_SUB_CRQ_INDIRECT has increased on some platforms from 16 to 128. If Live Partition Mobility is used to migrate a running OS image from a newer source platform to an older target platform, then H_SEND_SUB_CRQ_INDIRECT will fail with H_PARAMETER if 128 entries are queued.
Fix this by falling back to 16 entries if H_PARAMETER is returned from the hcall(). Signed-off-by: Juliet Kim <juli...@linux.vnet.ibm.com> --- drivers/net/ethernet/ibm/ibmvnic.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 4bd33245bad6..b66c2f26a427 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -1656,6 +1656,17 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) lpar_rc = send_subcrq_indirect(adapter, handle_array[queue_num], (u64)tx_buff->indir_dma, (u64)num_entries); + + /* Old firmware accepts max 16 num_entries */ + if (lpar_rc == H_PARAMETER && num_entries > 16) { + tx_crq.v1.n_crq_elem = 16; + tx_buff->num_entries = 16; + lpar_rc = send_subcrq_indirect(adapter, + handle_array[queue_num], + (u64)tx_buff->indir_dma, + 16); + } + dma_unmap_single(dev, tx_buff->indir_dma, sizeof(tx_buff->indir_arr), DMA_TO_DEVICE); } else { -- 2.18.1