mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +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
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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__
|
||||
|
||||
/*
|
||||
* 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,
|
||||
pte_t *ptep, unsigned long clr,
|
||||
unsigned long set, int huge)
|
||||
|
||||
@@ -53,7 +53,7 @@ static int text_area_cpu_up(unsigned int cpu)
|
||||
unsigned long addr;
|
||||
int err;
|
||||
|
||||
area = get_vm_area(PAGE_SIZE, VM_ALLOC);
|
||||
area = get_vm_area(PAGE_SIZE, 0);
|
||||
if (!area) {
|
||||
WARN_ONCE(1, "Failed to create text area for cpu %d\n",
|
||||
cpu);
|
||||
|
||||
@@ -116,6 +116,7 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter,
|
||||
struct ibmvnic_long_term_buff *ltb);
|
||||
static void ibmvnic_disable_irqs(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 {
|
||||
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];
|
||||
adapter->netdev->stats.tx_packets--;
|
||||
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 -=
|
||||
tx_buff->skb->len;
|
||||
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,
|
||||
struct ibmvnic_sub_crq_queue *tx_scrq)
|
||||
struct ibmvnic_sub_crq_queue *tx_scrq,
|
||||
bool indirect)
|
||||
{
|
||||
struct ibmvnic_ind_xmit_queue *ind_bufp;
|
||||
u64 dma_addr;
|
||||
@@ -2176,12 +2198,18 @@ static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter,
|
||||
|
||||
if (!entries)
|
||||
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)
|
||||
ibmvnic_tx_scrq_clean_buffer(adapter, tx_scrq);
|
||||
else
|
||||
ind_bufp->index = 0;
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
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;
|
||||
union sub_crq indir_arr[16];
|
||||
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;
|
||||
dma_addr_t data_dma_addr;
|
||||
struct netdev_queue *txq;
|
||||
unsigned long lpar_rc;
|
||||
unsigned int skblen;
|
||||
union sub_crq tx_crq;
|
||||
unsigned int offset;
|
||||
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_send_failed++;
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -2249,8 +2281,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_send_failed++;
|
||||
tx_dropped++;
|
||||
ibmvnic_tx_scrq_flush(adapter, tx_scrq);
|
||||
ret = NETDEV_TX_OK;
|
||||
lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);
|
||||
if (lpar_rc != H_SUCCESS)
|
||||
goto tx_err;
|
||||
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->index = bufidx;
|
||||
tx_buff->pool_index = queue_num;
|
||||
skblen = skb->len;
|
||||
|
||||
memset(&tx_crq, 0, sizeof(tx_crq));
|
||||
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.mss = cpu_to_be16(skb_shinfo(skb)->gso_size);
|
||||
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)
|
||||
@@ -2355,7 +2401,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
tx_buff->num_entries = num_entries;
|
||||
/* flush buffer if current entry can not fit */
|
||||
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)
|
||||
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;
|
||||
memcpy(&ind_bufp->indir_arr[ind_bufp->index], &indir_arr[0],
|
||||
num_entries * sizeof(struct ibmvnic_generic_scrq));
|
||||
|
||||
ind_bufp->index += num_entries;
|
||||
if (__netdev_tx_sent_queue(txq, skb->len,
|
||||
netdev_xmit_more() &&
|
||||
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)
|
||||
goto tx_err;
|
||||
}
|
||||
|
||||
tx_bpackets++;
|
||||
|
||||
early_exit:
|
||||
if (atomic_add_return(num_entries, &tx_scrq->used)
|
||||
>= adapter->req_tx_entries_per_subcrq) {
|
||||
netdev_dbg(netdev, "Stopping queue %d\n", queue_num);
|
||||
netif_stop_subqueue(netdev, queue_num);
|
||||
}
|
||||
|
||||
tx_packets++;
|
||||
tx_bytes += skb->len;
|
||||
tx_bytes += skblen;
|
||||
txq_trans_cond_update(txq);
|
||||
ret = NETDEV_TX_OK;
|
||||
goto out;
|
||||
@@ -2408,10 +2457,11 @@ out:
|
||||
rcu_read_unlock();
|
||||
netdev->stats.tx_dropped += tx_dropped;
|
||||
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_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].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);
|
||||
|
||||
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;
|
||||
|
||||
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));
|
||||
|
||||
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++;
|
||||
data[i] = adapter->tx_stats_buffers[j].bytes;
|
||||
i++;
|
||||
|
||||
@@ -213,7 +213,8 @@ struct ibmvnic_statistics {
|
||||
|
||||
#define NUM_TX_STATS 3
|
||||
struct ibmvnic_tx_queue_stats {
|
||||
u64 packets;
|
||||
u64 batched_packets;
|
||||
u64 direct_packets;
|
||||
u64 bytes;
|
||||
u64 dropped_packets;
|
||||
};
|
||||
|
||||
@@ -2159,6 +2159,7 @@ static int axienet_probe(struct platform_device *pdev)
|
||||
|
||||
lp->phylink_config.dev = &ndev->dev;
|
||||
lp->phylink_config.type = PHYLINK_NETDEV;
|
||||
lp->phylink_config.mac_managed_pm = true;
|
||||
lp->phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_ASYM_PAUSE |
|
||||
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_dev *geneve, *next;
|
||||
struct net_device *dev, *aux;
|
||||
|
||||
/* gather any geneve devices that were moved into this ns */
|
||||
for_each_netdev_safe(net, dev, aux)
|
||||
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);
|
||||
}
|
||||
list_for_each_entry_safe(geneve, next, &gn->geneve_list, next)
|
||||
geneve_dellink(geneve->dev, head);
|
||||
}
|
||||
|
||||
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.
|
||||
* f_midi_transmit eats req, don't queue it again. */
|
||||
req->length = 0;
|
||||
f_midi_transmit(midi);
|
||||
queue_work(system_highpri_wq, &midi->work);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1511,8 +1511,8 @@ void usb_del_gadget(struct usb_gadget *gadget)
|
||||
|
||||
kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
|
||||
sysfs_remove_link(&udc->dev.kobj, "gadget");
|
||||
flush_work(&gadget->work);
|
||||
device_del(&gadget->dev);
|
||||
flush_work(&gadget->work);
|
||||
ida_free(&gadget_id_numbers, gadget->id_number);
|
||||
cancel_work_sync(&udc->vbus_work);
|
||||
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);
|
||||
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,
|
||||
const char *hwaddr);
|
||||
struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
|
||||
|
||||
@@ -929,6 +929,12 @@ out:
|
||||
}
|
||||
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
|
||||
* @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
|
||||
* 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
|
||||
* 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;
|
||||
|
||||
for_each_netdev_rcu(net, dev)
|
||||
if (dev->type == type &&
|
||||
!memcmp(dev->dev_addr, ha, dev->addr_len))
|
||||
if (dev_addr_cmp(dev, type, ha))
|
||||
return dev;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
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, *ret = NULL;
|
||||
|
||||
@@ -751,23 +751,30 @@ __skb_flow_dissect_ports(const struct sk_buff *skb,
|
||||
void *target_container, const void *data,
|
||||
int nhoff, u8 ip_proto, int hlen)
|
||||
{
|
||||
enum flow_dissector_key_id dissector_ports = FLOW_DISSECTOR_KEY_MAX;
|
||||
struct flow_dissector_key_ports *key_ports;
|
||||
struct flow_dissector_key_ports_range *key_ports_range = NULL;
|
||||
struct flow_dissector_key_ports *key_ports = NULL;
|
||||
__be32 ports;
|
||||
|
||||
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
|
||||
dissector_ports = FLOW_DISSECTOR_KEY_PORTS;
|
||||
else if (dissector_uses_key(flow_dissector,
|
||||
FLOW_DISSECTOR_KEY_PORTS_RANGE))
|
||||
dissector_ports = FLOW_DISSECTOR_KEY_PORTS_RANGE;
|
||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
||||
FLOW_DISSECTOR_KEY_PORTS,
|
||||
target_container);
|
||||
|
||||
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;
|
||||
|
||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
||||
dissector_ports,
|
||||
target_container);
|
||||
key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
|
||||
data, hlen);
|
||||
ports = __skb_flow_get_ports(skb, nhoff, ip_proto, data, hlen);
|
||||
|
||||
if (key_ports)
|
||||
key_ports->ports = ports;
|
||||
|
||||
if (key_ports_range)
|
||||
key_ports_range->tp.ports = ports;
|
||||
}
|
||||
|
||||
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,
|
||||
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_control *key_control;
|
||||
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;
|
||||
}
|
||||
|
||||
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,
|
||||
FLOW_DISSECTOR_KEY_PORTS,
|
||||
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->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,
|
||||
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))
|
||||
return -EINVAL;
|
||||
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);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
@@ -121,7 +121,7 @@ static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||
{ CS42L42_HP_CTL, 0x03 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIC_DET_CTL1, 0xB6 },
|
||||
{ CS42L42_TIPSENSE_CTL, 0xC2 },
|
||||
{ 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_PWR_CTL1, 0x0A },
|
||||
{ CS42L42_PWR_CTL2, 0x84 },
|
||||
{ CS42L42_HP_CTL, 0x03 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_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_PWR_CTL1, 0x0E },
|
||||
{ CS42L42_PWR_CTL2, 0x84 },
|
||||
{ CS42L42_HP_CTL, 0x01 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_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_TSRS_PLUG_STATUS, 0x00 },
|
||||
};
|
||||
int fsv_old, fsv_new;
|
||||
unsigned int fsv;
|
||||
|
||||
/* Bring CS42L42 out of Reset */
|
||||
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 */
|
||||
cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs));
|
||||
|
||||
fsv_old = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
||||
if (cs42l42->full_scale_vol == CS42L42_FULL_SCALE_VOL_0DB)
|
||||
fsv_new = fsv_old & ~CS42L42_FULL_SCALE_VOL_MASK;
|
||||
else
|
||||
fsv_new = fsv_old & CS42L42_FULL_SCALE_VOL_MASK;
|
||||
if (fsv_new != fsv_old)
|
||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv_new);
|
||||
fsv = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
||||
if (cs42l42->full_scale_vol) {
|
||||
// Set the full scale volume bit
|
||||
fsv |= CS42L42_FULL_SCALE_VOL_MASK;
|
||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv);
|
||||
}
|
||||
// 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
|
||||
* 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_ADC_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_HP_CTL, 0x0F },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_ASP_RX_DAI0_EN, 0x00 },
|
||||
{ CS42L42_ASP_CLK_CFG, 0x00 },
|
||||
{ CS42L42_PWR_CTL1, 0xFE },
|
||||
|
||||
@@ -230,9 +230,10 @@ enum cs8409_coefficient_index_registers {
|
||||
#define CS42L42_PDN_TIMEOUT_US (250000)
|
||||
#define CS42L42_PDN_SLEEP_US (2000)
|
||||
#define CS42L42_INIT_TIMEOUT_MS (45)
|
||||
#define CS42L42_ANA_MUTE_AB (0x0C)
|
||||
#define CS42L42_FULL_SCALE_VOL_MASK (2)
|
||||
#define CS42L42_FULL_SCALE_VOL_0DB (1)
|
||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (0)
|
||||
#define CS42L42_FULL_SCALE_VOL_0DB (0)
|
||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (1)
|
||||
|
||||
/* 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);
|
||||
|
||||
msleep(75);
|
||||
alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
|
||||
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;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(0);
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
tdm_val = TDM_SHIFT_CTRL(4);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
||||
Reference in New Issue
Block a user