/* * IrNET protocol module : Synchronous PPP over an IrDA socket. * * Jean II - HPL `00 - * * This file contains all definitions and declarations necessary for the * IRDA part of the IrNET module (dealing with IrTTP, IrIAS and co). * This file is a private header, so other modules don't want to know * what's in there... */ #ifndef IRNET_IRDA_H #define IRNET_IRDA_H /***************************** INCLUDES *****************************/ /* Please add other headers in irnet.h */ #include "irnet.h" /* Module global include */ /************************ CONSTANTS & MACROS ************************/ /* * Name of the service (socket name) used by IrNET */ /* IAS object name (or part of it) */ #define IRNET_SERVICE_NAME "IrNetv1" /* IAS attribute */ #define IRNET_IAS_VALUE "IrDA:TinyTP:LsapSel" /* LMP notify name for client (only for /proc/net/irda/irlmp) */ #define IRNET_NOTIFY_NAME "IrNET socket" /* LMP notify name for server (only for /proc/net/irda/irlmp) */ #define IRNET_NOTIFY_NAME_SERV "IrNET server" /****************************** TYPES ******************************/ /* * This is the main structure where we store all the data pertaining to * the IrNET server (listen for connection requests) and the root * of the IrNET socket list */ typedef struct irnet_root { irnet_socket s; /* To pretend we are a client... */ /* Generic stuff */ int magic; /* Paranoia */ int running; /* Are we operational ? */ /* Link list of all IrNET instances opened */ hashbin_t * list; spinlock_t spinlock; /* Serialize access to the list */ /* Note : the way hashbin has been designed is absolutely not * reentrant, beware... So, we blindly protect all with spinlock */ /* Handle for the hint bit advertised in IrLMP */ void * skey; /* Server socket part */ struct ias_object * ias_obj; /* Our service name + lsap in IAS */ } irnet_root; /**************************** PROTOTYPES ****************************/ /* ----------------------- CONTROL CHANNEL ----------------------- */ static void irnet_post_event(irnet_socket *, irnet_event, __u32, __u32, char *, __u16); /* ----------------------- IRDA SUBROUTINES ----------------------- */ static inline int irnet_open_tsap(irnet_socket *); static inline __u8 irnet_ias_to_tsap(irnet_socket *, int, struct ias_value *); static inline int irnet_find_lsap_sel(irnet_socket *); static inline int irnet_connect_tsap(irnet_socket *); static inline int irnet_discover_next_daddr(irnet_socket *); static inline int irnet_discover_daddr_and_lsap_sel(irnet_socket *); static inline int irnet_dname_to_daddr(irnet_socket *); /* ------------------------ SERVER SOCKET ------------------------ */ static inline int irnet_daddr_to_dname(irnet_socket *); static inline irnet_socket * irnet_find_socket(irnet_socket *); static inline int irnet_connect_socket(irnet_socket *, irnet_socket *, struct qos_info *, __u32, __u8); static inline void irnet_disconnect_server(irnet_socket *, struct sk_buff *); static inline int irnet_setup_server(void); static inline void irnet_destroy_server(void); /* ---------------------- IRDA-TTP CALLBACKS ---------------------- */ static int irnet_data_indication(void *, /* instance */ void *, /* sap */ struct sk_buff *); static void irnet_disconnect_indication(void *, void *, LM_REASON, struct sk_buff *); static void irnet_connect_confirm(void *, void *, struct qos_info *, __u32, __u8, struct sk_buff *); static void irnet_flow_indication(void *, void *, LOCAL_FLOW); static void irnet_status_indication(void *, LINK_STATUS, LOCK_STATUS); static void irnet_connect_indication(void *, void *, struct qos_info *, __u32, __u8, struct sk_buff *); /* -------------------- IRDA-IAS/LMP CALLBACKS -------------------- */ static void irnet_getvalue_confirm(int, __u16, struct ias_value *, void *); static void irnet_discovervalue_confirm(int, __u16, struct ias_value *, void *); #ifdef DISCOVERY_EVENTS static void irnet_discovery_indication(discinfo_t *, DISCOVERY_MODE, void *); static void irnet_expiry_indication(discinfo_t *, DISCOVERY_MODE, void *); #endif /**************************** VARIABLES ****************************/ /* * The IrNET server. Listen to connection requests and co... */ static struct irnet_root irnet_server; /* Control channel stuff (note : extern) */ struct irnet_ctrl_channel irnet_events; /* The /proc/net/irda directory, defined elsewhere... */ #ifdef CONFIG_PROC_FS extern struct proc_dir_entry *proc_irda; #endif /* CONFIG_PROC_FS */ #endif /* IRNET_IRDA_H */ d
authorBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
committerBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
commit030305d69fc6963c16003f50d7e8d74b02d0a143 (patch)
tree363a4e34d199178769b7e7eeb26ea2620a55847b /include/soc/imx/cpuidle.h
parent4d191b1b63c209e37bf27938ef365244d3c41084 (diff)
PCI/ASPM: Handle PCI-to-PCIe bridges as roots of PCIe hierarchies
In a struct pcie_link_state, link->root points to the pcie_link_state of the root of the PCIe hierarchy. For the topmost link, this points to itself (link->root = link). For others, we copy the pointer from the parent (link->root = link->parent->root). Previously we recognized that Root Ports originated PCIe hierarchies, but we treated PCI/PCI-X to PCIe Bridges as being in the middle of the hierarchy, and when we tried to copy the pointer from link->parent->root, there was no parent, and we dereferenced a NULL pointer: BUG: unable to handle kernel NULL pointer dereference at 0000000000000090 IP: [<ffffffff9e424350>] pcie_aspm_init_link_state+0x170/0x820 Recognize that PCI/PCI-X to PCIe Bridges originate PCIe hierarchies just like Root Ports do, so link->root for these devices should also point to itself. Fixes: 51ebfc92b72b ("PCI: Enumerate switches below PCI-to-PCIe bridges") Link: https://bugzilla.kernel.org/show_bug.cgi?id=193411 Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1022181 Tested-by: lists@ssl-mail.com Tested-by: Jayachandran C. <jnair@caviumnetworks.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> CC: stable@vger.kernel.org # v4.2+
Diffstat (limited to 'include/soc/imx/cpuidle.h')