mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Merge cb7bea9887 ("net: axienet: Set mac_managed_pm") into android14-6.1-lts
Steps on the way to 6.1.130 Resolves merge conflicts in: drivers/net/gtp.c drivers/usb/gadget/udc/core.c Change-Id: I1fe09ecb3c00f1374305ba58a46924194ccb1761 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -89,6 +89,34 @@ static inline int hash__hugepd_ok(hugepd_t hpd)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* With 4K page size the real_pte machinery is all nops.
|
||||||
|
*/
|
||||||
|
static inline real_pte_t __real_pte(pte_t pte, pte_t *ptep, int offset)
|
||||||
|
{
|
||||||
|
return (real_pte_t){pte};
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __rpte_to_pte(r) ((r).pte)
|
||||||
|
|
||||||
|
static inline unsigned long __rpte_to_hidx(real_pte_t rpte, unsigned long index)
|
||||||
|
{
|
||||||
|
return pte_val(__rpte_to_pte(rpte)) >> H_PAGE_F_GIX_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift) \
|
||||||
|
do { \
|
||||||
|
index = 0; \
|
||||||
|
shift = mmu_psize_defs[psize].shift; \
|
||||||
|
|
||||||
|
#define pte_iterate_hashed_end() } while(0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We expect this to be called only for user addresses or kernel virtual
|
||||||
|
* addresses other than the linear mapping.
|
||||||
|
*/
|
||||||
|
#define pte_pagesize_index(mm, addr, pte) MMU_PAGE_4K
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 4K PTE format is different from 64K PTE format. Saving the hash_slot is just
|
* 4K PTE format is different from 64K PTE format. Saving the hash_slot is just
|
||||||
* a matter of returning the PTE bits that need to be modified. On 64K PTE,
|
* a matter of returning the PTE bits that need to be modified. On 64K PTE,
|
||||||
|
|||||||
@@ -318,32 +318,6 @@ extern unsigned long pci_io_base;
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the default implementation of various PTE accessors, it's
|
|
||||||
* used in all cases except Book3S with 64K pages where we have a
|
|
||||||
* concept of sub-pages
|
|
||||||
*/
|
|
||||||
#ifndef __real_pte
|
|
||||||
|
|
||||||
#define __real_pte(e, p, o) ((real_pte_t){(e)})
|
|
||||||
#define __rpte_to_pte(r) ((r).pte)
|
|
||||||
#define __rpte_to_hidx(r,index) (pte_val(__rpte_to_pte(r)) >> H_PAGE_F_GIX_SHIFT)
|
|
||||||
|
|
||||||
#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift) \
|
|
||||||
do { \
|
|
||||||
index = 0; \
|
|
||||||
shift = mmu_psize_defs[psize].shift; \
|
|
||||||
|
|
||||||
#define pte_iterate_hashed_end() } while(0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We expect this to be called only for user addresses or kernel virtual
|
|
||||||
* addresses other than the linear mapping.
|
|
||||||
*/
|
|
||||||
#define pte_pagesize_index(mm, addr, pte) MMU_PAGE_4K
|
|
||||||
|
|
||||||
#endif /* __real_pte */
|
|
||||||
|
|
||||||
static inline unsigned long pte_update(struct mm_struct *mm, unsigned long addr,
|
static inline unsigned long pte_update(struct mm_struct *mm, unsigned long addr,
|
||||||
pte_t *ptep, unsigned long clr,
|
pte_t *ptep, unsigned long clr,
|
||||||
unsigned long set, int huge)
|
unsigned long set, int huge)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ static int text_area_cpu_up(unsigned int cpu)
|
|||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
area = get_vm_area(PAGE_SIZE, VM_ALLOC);
|
area = get_vm_area(PAGE_SIZE, 0);
|
||||||
if (!area) {
|
if (!area) {
|
||||||
WARN_ONCE(1, "Failed to create text area for cpu %d\n",
|
WARN_ONCE(1, "Failed to create text area for cpu %d\n",
|
||||||
cpu);
|
cpu);
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter,
|
|||||||
struct ibmvnic_long_term_buff *ltb);
|
struct ibmvnic_long_term_buff *ltb);
|
||||||
static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter);
|
static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter);
|
||||||
static void flush_reset_queue(struct ibmvnic_adapter *adapter);
|
static void flush_reset_queue(struct ibmvnic_adapter *adapter);
|
||||||
|
static void print_subcrq_error(struct device *dev, int rc, const char *func);
|
||||||
|
|
||||||
struct ibmvnic_stat {
|
struct ibmvnic_stat {
|
||||||
char name[ETH_GSTRING_LEN];
|
char name[ETH_GSTRING_LEN];
|
||||||
@@ -2135,7 +2136,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
|
|||||||
tx_buff = &tx_pool->tx_buff[index];
|
tx_buff = &tx_pool->tx_buff[index];
|
||||||
adapter->netdev->stats.tx_packets--;
|
adapter->netdev->stats.tx_packets--;
|
||||||
adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;
|
adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;
|
||||||
adapter->tx_stats_buffers[queue_num].packets--;
|
adapter->tx_stats_buffers[queue_num].batched_packets--;
|
||||||
adapter->tx_stats_buffers[queue_num].bytes -=
|
adapter->tx_stats_buffers[queue_num].bytes -=
|
||||||
tx_buff->skb->len;
|
tx_buff->skb->len;
|
||||||
dev_kfree_skb_any(tx_buff->skb);
|
dev_kfree_skb_any(tx_buff->skb);
|
||||||
@@ -2160,8 +2161,29 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int send_subcrq_direct(struct ibmvnic_adapter *adapter,
|
||||||
|
u64 remote_handle, u64 *entry)
|
||||||
|
{
|
||||||
|
unsigned int ua = adapter->vdev->unit_address;
|
||||||
|
struct device *dev = &adapter->vdev->dev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Make sure the hypervisor sees the complete request */
|
||||||
|
dma_wmb();
|
||||||
|
rc = plpar_hcall_norets(H_SEND_SUB_CRQ, ua,
|
||||||
|
cpu_to_be64(remote_handle),
|
||||||
|
cpu_to_be64(entry[0]), cpu_to_be64(entry[1]),
|
||||||
|
cpu_to_be64(entry[2]), cpu_to_be64(entry[3]));
|
||||||
|
|
||||||
|
if (rc)
|
||||||
|
print_subcrq_error(dev, rc, __func__);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter,
|
static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter,
|
||||||
struct ibmvnic_sub_crq_queue *tx_scrq)
|
struct ibmvnic_sub_crq_queue *tx_scrq,
|
||||||
|
bool indirect)
|
||||||
{
|
{
|
||||||
struct ibmvnic_ind_xmit_queue *ind_bufp;
|
struct ibmvnic_ind_xmit_queue *ind_bufp;
|
||||||
u64 dma_addr;
|
u64 dma_addr;
|
||||||
@@ -2176,12 +2198,18 @@ static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter,
|
|||||||
|
|
||||||
if (!entries)
|
if (!entries)
|
||||||
return 0;
|
return 0;
|
||||||
rc = send_subcrq_indirect(adapter, handle, dma_addr, entries);
|
|
||||||
|
if (indirect)
|
||||||
|
rc = send_subcrq_indirect(adapter, handle, dma_addr, entries);
|
||||||
|
else
|
||||||
|
rc = send_subcrq_direct(adapter, handle,
|
||||||
|
(u64 *)ind_bufp->indir_arr);
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
ibmvnic_tx_scrq_clean_buffer(adapter, tx_scrq);
|
ibmvnic_tx_scrq_clean_buffer(adapter, tx_scrq);
|
||||||
else
|
else
|
||||||
ind_bufp->index = 0;
|
ind_bufp->index = 0;
|
||||||
return 0;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||||
@@ -2200,11 +2228,13 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
unsigned int tx_map_failed = 0;
|
unsigned int tx_map_failed = 0;
|
||||||
union sub_crq indir_arr[16];
|
union sub_crq indir_arr[16];
|
||||||
unsigned int tx_dropped = 0;
|
unsigned int tx_dropped = 0;
|
||||||
unsigned int tx_packets = 0;
|
unsigned int tx_dpackets = 0;
|
||||||
|
unsigned int tx_bpackets = 0;
|
||||||
unsigned int tx_bytes = 0;
|
unsigned int tx_bytes = 0;
|
||||||
dma_addr_t data_dma_addr;
|
dma_addr_t data_dma_addr;
|
||||||
struct netdev_queue *txq;
|
struct netdev_queue *txq;
|
||||||
unsigned long lpar_rc;
|
unsigned long lpar_rc;
|
||||||
|
unsigned int skblen;
|
||||||
union sub_crq tx_crq;
|
union sub_crq tx_crq;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
int num_entries = 1;
|
int num_entries = 1;
|
||||||
@@ -2234,7 +2264,9 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
tx_dropped++;
|
tx_dropped++;
|
||||||
tx_send_failed++;
|
tx_send_failed++;
|
||||||
ret = NETDEV_TX_OK;
|
ret = NETDEV_TX_OK;
|
||||||
ibmvnic_tx_scrq_flush(adapter, tx_scrq);
|
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);
|
||||||
|
if (lpar_rc != H_SUCCESS)
|
||||||
|
goto tx_err;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2249,8 +2281,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
tx_send_failed++;
|
tx_send_failed++;
|
||||||
tx_dropped++;
|
tx_dropped++;
|
||||||
ibmvnic_tx_scrq_flush(adapter, tx_scrq);
|
|
||||||
ret = NETDEV_TX_OK;
|
ret = NETDEV_TX_OK;
|
||||||
|
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);
|
||||||
|
if (lpar_rc != H_SUCCESS)
|
||||||
|
goto tx_err;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2303,6 +2337,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
tx_buff->skb = skb;
|
tx_buff->skb = skb;
|
||||||
tx_buff->index = bufidx;
|
tx_buff->index = bufidx;
|
||||||
tx_buff->pool_index = queue_num;
|
tx_buff->pool_index = queue_num;
|
||||||
|
skblen = skb->len;
|
||||||
|
|
||||||
memset(&tx_crq, 0, sizeof(tx_crq));
|
memset(&tx_crq, 0, sizeof(tx_crq));
|
||||||
tx_crq.v1.first = IBMVNIC_CRQ_CMD;
|
tx_crq.v1.first = IBMVNIC_CRQ_CMD;
|
||||||
@@ -2346,6 +2381,17 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
tx_crq.v1.flags1 |= IBMVNIC_TX_LSO;
|
tx_crq.v1.flags1 |= IBMVNIC_TX_LSO;
|
||||||
tx_crq.v1.mss = cpu_to_be16(skb_shinfo(skb)->gso_size);
|
tx_crq.v1.mss = cpu_to_be16(skb_shinfo(skb)->gso_size);
|
||||||
hdrs += 2;
|
hdrs += 2;
|
||||||
|
} else if (!ind_bufp->index && !netdev_xmit_more()) {
|
||||||
|
ind_bufp->indir_arr[0] = tx_crq;
|
||||||
|
ind_bufp->index = 1;
|
||||||
|
tx_buff->num_entries = 1;
|
||||||
|
netdev_tx_sent_queue(txq, skb->len);
|
||||||
|
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, false);
|
||||||
|
if (lpar_rc != H_SUCCESS)
|
||||||
|
goto tx_err;
|
||||||
|
|
||||||
|
tx_dpackets++;
|
||||||
|
goto early_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*hdrs >> 7) & 1)
|
if ((*hdrs >> 7) & 1)
|
||||||
@@ -2355,7 +2401,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
tx_buff->num_entries = num_entries;
|
tx_buff->num_entries = num_entries;
|
||||||
/* flush buffer if current entry can not fit */
|
/* flush buffer if current entry can not fit */
|
||||||
if (num_entries + ind_bufp->index > IBMVNIC_MAX_IND_DESCS) {
|
if (num_entries + ind_bufp->index > IBMVNIC_MAX_IND_DESCS) {
|
||||||
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq);
|
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);
|
||||||
if (lpar_rc != H_SUCCESS)
|
if (lpar_rc != H_SUCCESS)
|
||||||
goto tx_flush_err;
|
goto tx_flush_err;
|
||||||
}
|
}
|
||||||
@@ -2363,23 +2409,26 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
indir_arr[0] = tx_crq;
|
indir_arr[0] = tx_crq;
|
||||||
memcpy(&ind_bufp->indir_arr[ind_bufp->index], &indir_arr[0],
|
memcpy(&ind_bufp->indir_arr[ind_bufp->index], &indir_arr[0],
|
||||||
num_entries * sizeof(struct ibmvnic_generic_scrq));
|
num_entries * sizeof(struct ibmvnic_generic_scrq));
|
||||||
|
|
||||||
ind_bufp->index += num_entries;
|
ind_bufp->index += num_entries;
|
||||||
if (__netdev_tx_sent_queue(txq, skb->len,
|
if (__netdev_tx_sent_queue(txq, skb->len,
|
||||||
netdev_xmit_more() &&
|
netdev_xmit_more() &&
|
||||||
ind_bufp->index < IBMVNIC_MAX_IND_DESCS)) {
|
ind_bufp->index < IBMVNIC_MAX_IND_DESCS)) {
|
||||||
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq);
|
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);
|
||||||
if (lpar_rc != H_SUCCESS)
|
if (lpar_rc != H_SUCCESS)
|
||||||
goto tx_err;
|
goto tx_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tx_bpackets++;
|
||||||
|
|
||||||
|
early_exit:
|
||||||
if (atomic_add_return(num_entries, &tx_scrq->used)
|
if (atomic_add_return(num_entries, &tx_scrq->used)
|
||||||
>= adapter->req_tx_entries_per_subcrq) {
|
>= adapter->req_tx_entries_per_subcrq) {
|
||||||
netdev_dbg(netdev, "Stopping queue %d\n", queue_num);
|
netdev_dbg(netdev, "Stopping queue %d\n", queue_num);
|
||||||
netif_stop_subqueue(netdev, queue_num);
|
netif_stop_subqueue(netdev, queue_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_packets++;
|
tx_bytes += skblen;
|
||||||
tx_bytes += skb->len;
|
|
||||||
txq_trans_cond_update(txq);
|
txq_trans_cond_update(txq);
|
||||||
ret = NETDEV_TX_OK;
|
ret = NETDEV_TX_OK;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -2408,10 +2457,11 @@ out:
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
netdev->stats.tx_dropped += tx_dropped;
|
netdev->stats.tx_dropped += tx_dropped;
|
||||||
netdev->stats.tx_bytes += tx_bytes;
|
netdev->stats.tx_bytes += tx_bytes;
|
||||||
netdev->stats.tx_packets += tx_packets;
|
netdev->stats.tx_packets += tx_bpackets + tx_dpackets;
|
||||||
adapter->tx_send_failed += tx_send_failed;
|
adapter->tx_send_failed += tx_send_failed;
|
||||||
adapter->tx_map_failed += tx_map_failed;
|
adapter->tx_map_failed += tx_map_failed;
|
||||||
adapter->tx_stats_buffers[queue_num].packets += tx_packets;
|
adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets;
|
||||||
|
adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets;
|
||||||
adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
|
adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
|
||||||
adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
|
adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
|
||||||
|
|
||||||
@@ -3577,7 +3627,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
|
|||||||
memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
|
memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
|
||||||
|
|
||||||
for (i = 0; i < adapter->req_tx_queues; i++) {
|
for (i = 0; i < adapter->req_tx_queues; i++) {
|
||||||
snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
|
snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i);
|
||||||
|
data += ETH_GSTRING_LEN;
|
||||||
|
|
||||||
|
snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i);
|
||||||
data += ETH_GSTRING_LEN;
|
data += ETH_GSTRING_LEN;
|
||||||
|
|
||||||
snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
|
snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
|
||||||
@@ -3642,7 +3695,9 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
|
|||||||
(adapter, ibmvnic_stats[i].offset));
|
(adapter, ibmvnic_stats[i].offset));
|
||||||
|
|
||||||
for (j = 0; j < adapter->req_tx_queues; j++) {
|
for (j = 0; j < adapter->req_tx_queues; j++) {
|
||||||
data[i] = adapter->tx_stats_buffers[j].packets;
|
data[i] = adapter->tx_stats_buffers[j].batched_packets;
|
||||||
|
i++;
|
||||||
|
data[i] = adapter->tx_stats_buffers[j].direct_packets;
|
||||||
i++;
|
i++;
|
||||||
data[i] = adapter->tx_stats_buffers[j].bytes;
|
data[i] = adapter->tx_stats_buffers[j].bytes;
|
||||||
i++;
|
i++;
|
||||||
|
|||||||
@@ -213,7 +213,8 @@ struct ibmvnic_statistics {
|
|||||||
|
|
||||||
#define NUM_TX_STATS 3
|
#define NUM_TX_STATS 3
|
||||||
struct ibmvnic_tx_queue_stats {
|
struct ibmvnic_tx_queue_stats {
|
||||||
u64 packets;
|
u64 batched_packets;
|
||||||
|
u64 direct_packets;
|
||||||
u64 bytes;
|
u64 bytes;
|
||||||
u64 dropped_packets;
|
u64 dropped_packets;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2159,6 +2159,7 @@ static int axienet_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
lp->phylink_config.dev = &ndev->dev;
|
lp->phylink_config.dev = &ndev->dev;
|
||||||
lp->phylink_config.type = PHYLINK_NETDEV;
|
lp->phylink_config.type = PHYLINK_NETDEV;
|
||||||
|
lp->phylink_config.mac_managed_pm = true;
|
||||||
lp->phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_ASYM_PAUSE |
|
lp->phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_ASYM_PAUSE |
|
||||||
MAC_10FD | MAC_100FD | MAC_1000FD;
|
MAC_10FD | MAC_100FD | MAC_1000FD;
|
||||||
|
|
||||||
|
|||||||
@@ -1965,21 +1965,9 @@ static void geneve_destroy_tunnels(struct net *net, struct list_head *head)
|
|||||||
{
|
{
|
||||||
struct geneve_net *gn = net_generic(net, geneve_net_id);
|
struct geneve_net *gn = net_generic(net, geneve_net_id);
|
||||||
struct geneve_dev *geneve, *next;
|
struct geneve_dev *geneve, *next;
|
||||||
struct net_device *dev, *aux;
|
|
||||||
|
|
||||||
/* gather any geneve devices that were moved into this ns */
|
list_for_each_entry_safe(geneve, next, &gn->geneve_list, next)
|
||||||
for_each_netdev_safe(net, dev, aux)
|
geneve_dellink(geneve->dev, head);
|
||||||
if (dev->rtnl_link_ops == &geneve_link_ops)
|
|
||||||
unregister_netdevice_queue(dev, head);
|
|
||||||
|
|
||||||
/* now gather any other geneve devices that were created in this ns */
|
|
||||||
list_for_each_entry_safe(geneve, next, &gn->geneve_list, next) {
|
|
||||||
/* If geneve->dev is in the same netns, it was already added
|
|
||||||
* to the list by the previous loop.
|
|
||||||
*/
|
|
||||||
if (!net_eq(dev_net(geneve->dev), net))
|
|
||||||
unregister_netdevice_queue(geneve->dev, head);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __net_exit geneve_exit_batch_net(struct list_head *net_list)
|
static void __net_exit geneve_exit_batch_net(struct list_head *net_list)
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ f_midi_complete(struct usb_ep *ep, struct usb_request *req)
|
|||||||
/* Our transmit completed. See if there's more to go.
|
/* Our transmit completed. See if there's more to go.
|
||||||
* f_midi_transmit eats req, don't queue it again. */
|
* f_midi_transmit eats req, don't queue it again. */
|
||||||
req->length = 0;
|
req->length = 0;
|
||||||
f_midi_transmit(midi);
|
queue_work(system_highpri_wq, &midi->work);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1511,8 +1511,8 @@ void usb_del_gadget(struct usb_gadget *gadget)
|
|||||||
|
|
||||||
kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
|
kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
|
||||||
sysfs_remove_link(&udc->dev.kobj, "gadget");
|
sysfs_remove_link(&udc->dev.kobj, "gadget");
|
||||||
flush_work(&gadget->work);
|
|
||||||
device_del(&gadget->dev);
|
device_del(&gadget->dev);
|
||||||
|
flush_work(&gadget->work);
|
||||||
ida_free(&gadget_id_numbers, gadget->id_number);
|
ida_free(&gadget_id_numbers, gadget->id_number);
|
||||||
cancel_work_sync(&udc->vbus_work);
|
cancel_work_sync(&udc->vbus_work);
|
||||||
device_unregister(&udc->dev);
|
device_unregister(&udc->dev);
|
||||||
|
|||||||
@@ -3044,6 +3044,8 @@ static inline struct net_device *first_net_device_rcu(struct net *net)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int netdev_boot_setup_check(struct net_device *dev);
|
int netdev_boot_setup_check(struct net_device *dev);
|
||||||
|
struct net_device *dev_getbyhwaddr(struct net *net, unsigned short type,
|
||||||
|
const char *hwaddr);
|
||||||
struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
|
struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
|
||||||
const char *hwaddr);
|
const char *hwaddr);
|
||||||
struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
|
struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
|
||||||
|
|||||||
@@ -929,6 +929,12 @@ out:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(netdev_get_name);
|
EXPORT_SYMBOL_GPL(netdev_get_name);
|
||||||
|
|
||||||
|
static bool dev_addr_cmp(struct net_device *dev, unsigned short type,
|
||||||
|
const char *ha)
|
||||||
|
{
|
||||||
|
return dev->type == type && !memcmp(dev->dev_addr, ha, dev->addr_len);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dev_getbyhwaddr_rcu - find a device by its hardware address
|
* dev_getbyhwaddr_rcu - find a device by its hardware address
|
||||||
* @net: the applicable net namespace
|
* @net: the applicable net namespace
|
||||||
@@ -937,7 +943,7 @@ EXPORT_SYMBOL_GPL(netdev_get_name);
|
|||||||
*
|
*
|
||||||
* Search for an interface by MAC address. Returns NULL if the device
|
* Search for an interface by MAC address. Returns NULL if the device
|
||||||
* is not found or a pointer to the device.
|
* is not found or a pointer to the device.
|
||||||
* The caller must hold RCU or RTNL.
|
* The caller must hold RCU.
|
||||||
* The returned device has not had its ref count increased
|
* The returned device has not had its ref count increased
|
||||||
* and the caller must therefore be careful about locking
|
* and the caller must therefore be careful about locking
|
||||||
*
|
*
|
||||||
@@ -949,14 +955,39 @@ struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
|
|||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
for_each_netdev_rcu(net, dev)
|
for_each_netdev_rcu(net, dev)
|
||||||
if (dev->type == type &&
|
if (dev_addr_cmp(dev, type, ha))
|
||||||
!memcmp(dev->dev_addr, ha, dev->addr_len))
|
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dev_getbyhwaddr_rcu);
|
EXPORT_SYMBOL(dev_getbyhwaddr_rcu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dev_getbyhwaddr() - find a device by its hardware address
|
||||||
|
* @net: the applicable net namespace
|
||||||
|
* @type: media type of device
|
||||||
|
* @ha: hardware address
|
||||||
|
*
|
||||||
|
* Similar to dev_getbyhwaddr_rcu(), but the owner needs to hold
|
||||||
|
* rtnl_lock.
|
||||||
|
*
|
||||||
|
* Context: rtnl_lock() must be held.
|
||||||
|
* Return: pointer to the net_device, or NULL if not found
|
||||||
|
*/
|
||||||
|
struct net_device *dev_getbyhwaddr(struct net *net, unsigned short type,
|
||||||
|
const char *ha)
|
||||||
|
{
|
||||||
|
struct net_device *dev;
|
||||||
|
|
||||||
|
ASSERT_RTNL();
|
||||||
|
for_each_netdev(net, dev)
|
||||||
|
if (dev_addr_cmp(dev, type, ha))
|
||||||
|
return dev;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dev_getbyhwaddr);
|
||||||
|
|
||||||
struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type)
|
struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type)
|
||||||
{
|
{
|
||||||
struct net_device *dev, *ret = NULL;
|
struct net_device *dev, *ret = NULL;
|
||||||
|
|||||||
@@ -751,23 +751,30 @@ __skb_flow_dissect_ports(const struct sk_buff *skb,
|
|||||||
void *target_container, const void *data,
|
void *target_container, const void *data,
|
||||||
int nhoff, u8 ip_proto, int hlen)
|
int nhoff, u8 ip_proto, int hlen)
|
||||||
{
|
{
|
||||||
enum flow_dissector_key_id dissector_ports = FLOW_DISSECTOR_KEY_MAX;
|
struct flow_dissector_key_ports_range *key_ports_range = NULL;
|
||||||
struct flow_dissector_key_ports *key_ports;
|
struct flow_dissector_key_ports *key_ports = NULL;
|
||||||
|
__be32 ports;
|
||||||
|
|
||||||
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
|
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
|
||||||
dissector_ports = FLOW_DISSECTOR_KEY_PORTS;
|
key_ports = skb_flow_dissector_target(flow_dissector,
|
||||||
else if (dissector_uses_key(flow_dissector,
|
FLOW_DISSECTOR_KEY_PORTS,
|
||||||
FLOW_DISSECTOR_KEY_PORTS_RANGE))
|
target_container);
|
||||||
dissector_ports = FLOW_DISSECTOR_KEY_PORTS_RANGE;
|
|
||||||
|
|
||||||
if (dissector_ports == FLOW_DISSECTOR_KEY_MAX)
|
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS_RANGE))
|
||||||
|
key_ports_range = skb_flow_dissector_target(flow_dissector,
|
||||||
|
FLOW_DISSECTOR_KEY_PORTS_RANGE,
|
||||||
|
target_container);
|
||||||
|
|
||||||
|
if (!key_ports && !key_ports_range)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
ports = __skb_flow_get_ports(skb, nhoff, ip_proto, data, hlen);
|
||||||
dissector_ports,
|
|
||||||
target_container);
|
if (key_ports)
|
||||||
key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
|
key_ports->ports = ports;
|
||||||
data, hlen);
|
|
||||||
|
if (key_ports_range)
|
||||||
|
key_ports_range->tp.ports = ports;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -822,6 +829,7 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
|
|||||||
struct flow_dissector *flow_dissector,
|
struct flow_dissector *flow_dissector,
|
||||||
void *target_container)
|
void *target_container)
|
||||||
{
|
{
|
||||||
|
struct flow_dissector_key_ports_range *key_ports_range = NULL;
|
||||||
struct flow_dissector_key_ports *key_ports = NULL;
|
struct flow_dissector_key_ports *key_ports = NULL;
|
||||||
struct flow_dissector_key_control *key_control;
|
struct flow_dissector_key_control *key_control;
|
||||||
struct flow_dissector_key_basic *key_basic;
|
struct flow_dissector_key_basic *key_basic;
|
||||||
@@ -866,20 +874,21 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
|
|||||||
key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
|
key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
|
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) {
|
||||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
key_ports = skb_flow_dissector_target(flow_dissector,
|
||||||
FLOW_DISSECTOR_KEY_PORTS,
|
FLOW_DISSECTOR_KEY_PORTS,
|
||||||
target_container);
|
target_container);
|
||||||
else if (dissector_uses_key(flow_dissector,
|
|
||||||
FLOW_DISSECTOR_KEY_PORTS_RANGE))
|
|
||||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
|
||||||
FLOW_DISSECTOR_KEY_PORTS_RANGE,
|
|
||||||
target_container);
|
|
||||||
|
|
||||||
if (key_ports) {
|
|
||||||
key_ports->src = flow_keys->sport;
|
key_ports->src = flow_keys->sport;
|
||||||
key_ports->dst = flow_keys->dport;
|
key_ports->dst = flow_keys->dport;
|
||||||
}
|
}
|
||||||
|
if (dissector_uses_key(flow_dissector,
|
||||||
|
FLOW_DISSECTOR_KEY_PORTS_RANGE)) {
|
||||||
|
key_ports_range = skb_flow_dissector_target(flow_dissector,
|
||||||
|
FLOW_DISSECTOR_KEY_PORTS_RANGE,
|
||||||
|
target_container);
|
||||||
|
key_ports_range->tp.src = flow_keys->sport;
|
||||||
|
key_ports_range->tp.dst = flow_keys->dport;
|
||||||
|
}
|
||||||
|
|
||||||
if (dissector_uses_key(flow_dissector,
|
if (dissector_uses_key(flow_dissector,
|
||||||
FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
|
FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
|
||||||
|
|||||||
@@ -1030,7 +1030,7 @@ static int arp_req_set_public(struct net *net, struct arpreq *r,
|
|||||||
if (mask && mask != htonl(0xFFFFFFFF))
|
if (mask && mask != htonl(0xFFFFFFFF))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!dev && (r->arp_flags & ATF_COM)) {
|
if (!dev && (r->arp_flags & ATF_COM)) {
|
||||||
dev = dev_getbyhwaddr_rcu(net, r->arp_ha.sa_family,
|
dev = dev_getbyhwaddr(net, r->arp_ha.sa_family,
|
||||||
r->arp_ha.sa_data);
|
r->arp_ha.sa_data);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {
|
|||||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||||
{ CS42L42_HP_CTL, 0x03 },
|
{ CS42L42_HP_CTL, 0x0D },
|
||||||
{ CS42L42_MIC_DET_CTL1, 0xB6 },
|
{ CS42L42_MIC_DET_CTL1, 0xB6 },
|
||||||
{ CS42L42_TIPSENSE_CTL, 0xC2 },
|
{ CS42L42_TIPSENSE_CTL, 0xC2 },
|
||||||
{ CS42L42_HS_CLAMP_DISABLE, 0x01 },
|
{ CS42L42_HS_CLAMP_DISABLE, 0x01 },
|
||||||
@@ -315,7 +315,7 @@ static const struct cs8409_i2c_param dolphin_c0_init_reg_seq[] = {
|
|||||||
{ CS42L42_ASP_TX_SZ_EN, 0x01 },
|
{ CS42L42_ASP_TX_SZ_EN, 0x01 },
|
||||||
{ CS42L42_PWR_CTL1, 0x0A },
|
{ CS42L42_PWR_CTL1, 0x0A },
|
||||||
{ CS42L42_PWR_CTL2, 0x84 },
|
{ CS42L42_PWR_CTL2, 0x84 },
|
||||||
{ CS42L42_HP_CTL, 0x03 },
|
{ CS42L42_HP_CTL, 0x0D },
|
||||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||||
@@ -371,7 +371,7 @@ static const struct cs8409_i2c_param dolphin_c1_init_reg_seq[] = {
|
|||||||
{ CS42L42_ASP_TX_SZ_EN, 0x00 },
|
{ CS42L42_ASP_TX_SZ_EN, 0x00 },
|
||||||
{ CS42L42_PWR_CTL1, 0x0E },
|
{ CS42L42_PWR_CTL1, 0x0E },
|
||||||
{ CS42L42_PWR_CTL2, 0x84 },
|
{ CS42L42_PWR_CTL2, 0x84 },
|
||||||
{ CS42L42_HP_CTL, 0x01 },
|
{ CS42L42_HP_CTL, 0x0D },
|
||||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||||
|
|||||||
@@ -876,7 +876,7 @@ static void cs42l42_resume(struct sub_codec *cs42l42)
|
|||||||
{ CS42L42_DET_INT_STATUS2, 0x00 },
|
{ CS42L42_DET_INT_STATUS2, 0x00 },
|
||||||
{ CS42L42_TSRS_PLUG_STATUS, 0x00 },
|
{ CS42L42_TSRS_PLUG_STATUS, 0x00 },
|
||||||
};
|
};
|
||||||
int fsv_old, fsv_new;
|
unsigned int fsv;
|
||||||
|
|
||||||
/* Bring CS42L42 out of Reset */
|
/* Bring CS42L42 out of Reset */
|
||||||
spec->gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0);
|
spec->gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0);
|
||||||
@@ -893,13 +893,15 @@ static void cs42l42_resume(struct sub_codec *cs42l42)
|
|||||||
/* Clear interrupts, by reading interrupt status registers */
|
/* Clear interrupts, by reading interrupt status registers */
|
||||||
cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs));
|
cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs));
|
||||||
|
|
||||||
fsv_old = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
fsv = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
||||||
if (cs42l42->full_scale_vol == CS42L42_FULL_SCALE_VOL_0DB)
|
if (cs42l42->full_scale_vol) {
|
||||||
fsv_new = fsv_old & ~CS42L42_FULL_SCALE_VOL_MASK;
|
// Set the full scale volume bit
|
||||||
else
|
fsv |= CS42L42_FULL_SCALE_VOL_MASK;
|
||||||
fsv_new = fsv_old & CS42L42_FULL_SCALE_VOL_MASK;
|
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv);
|
||||||
if (fsv_new != fsv_old)
|
}
|
||||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv_new);
|
// Unmute analog channels A and B
|
||||||
|
fsv = (fsv & ~CS42L42_ANA_MUTE_AB);
|
||||||
|
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv);
|
||||||
|
|
||||||
/* we have to explicitly allow unsol event handling even during the
|
/* we have to explicitly allow unsol event handling even during the
|
||||||
* resume phase so that the jack event is processed properly
|
* resume phase so that the jack event is processed properly
|
||||||
@@ -921,7 +923,7 @@ static void cs42l42_suspend(struct sub_codec *cs42l42)
|
|||||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_ADC_VOL, 0x3F },
|
{ CS42L42_MIXER_ADC_VOL, 0x3F },
|
||||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||||
{ CS42L42_HP_CTL, 0x0F },
|
{ CS42L42_HP_CTL, 0x0D },
|
||||||
{ CS42L42_ASP_RX_DAI0_EN, 0x00 },
|
{ CS42L42_ASP_RX_DAI0_EN, 0x00 },
|
||||||
{ CS42L42_ASP_CLK_CFG, 0x00 },
|
{ CS42L42_ASP_CLK_CFG, 0x00 },
|
||||||
{ CS42L42_PWR_CTL1, 0xFE },
|
{ CS42L42_PWR_CTL1, 0xFE },
|
||||||
|
|||||||
@@ -230,9 +230,10 @@ enum cs8409_coefficient_index_registers {
|
|||||||
#define CS42L42_PDN_TIMEOUT_US (250000)
|
#define CS42L42_PDN_TIMEOUT_US (250000)
|
||||||
#define CS42L42_PDN_SLEEP_US (2000)
|
#define CS42L42_PDN_SLEEP_US (2000)
|
||||||
#define CS42L42_INIT_TIMEOUT_MS (45)
|
#define CS42L42_INIT_TIMEOUT_MS (45)
|
||||||
|
#define CS42L42_ANA_MUTE_AB (0x0C)
|
||||||
#define CS42L42_FULL_SCALE_VOL_MASK (2)
|
#define CS42L42_FULL_SCALE_VOL_MASK (2)
|
||||||
#define CS42L42_FULL_SCALE_VOL_0DB (1)
|
#define CS42L42_FULL_SCALE_VOL_0DB (0)
|
||||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (0)
|
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (1)
|
||||||
|
|
||||||
/* Dell BULLSEYE / WARLOCK / CYBORG Specific Definitions */
|
/* Dell BULLSEYE / WARLOCK / CYBORG Specific Definitions */
|
||||||
|
|
||||||
|
|||||||
@@ -3776,6 +3776,7 @@ static void alc225_init(struct hda_codec *codec)
|
|||||||
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
|
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
|
||||||
|
|
||||||
msleep(75);
|
msleep(75);
|
||||||
|
alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
|
||||||
alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
|
alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -453,11 +453,11 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
|
|||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_DSP_A:
|
case SND_SOC_DAIFMT_DSP_A:
|
||||||
val = I2S_TXCR_TFS_TDM_PCM;
|
val = I2S_TXCR_TFS_TDM_PCM;
|
||||||
tdm_val = TDM_SHIFT_CTRL(0);
|
tdm_val = TDM_SHIFT_CTRL(2);
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_DSP_B:
|
case SND_SOC_DAIFMT_DSP_B:
|
||||||
val = I2S_TXCR_TFS_TDM_PCM;
|
val = I2S_TXCR_TFS_TDM_PCM;
|
||||||
tdm_val = TDM_SHIFT_CTRL(2);
|
tdm_val = TDM_SHIFT_CTRL(4);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|||||||
Reference in New Issue
Block a user