Loading drivers/ieee1394/config_roms.c +5 −2 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ struct hpsb_config_rom_entry { unsigned int flag; }; /* The default host entry. This must succeed. */ int hpsb_default_host_entry(struct hpsb_host *host) { struct csr1212_keyval *root; Loading Loading @@ -170,7 +170,7 @@ static struct hpsb_config_rom_entry *const config_rom_entries[] = { NULL, }; /* Initialize all config roms */ int hpsb_init_config_roms(void) { int i, error = 0; Loading @@ -191,6 +191,7 @@ int hpsb_init_config_roms(void) return error; } /* Cleanup all config roms */ void hpsb_cleanup_config_roms(void) { int i; Loading @@ -201,6 +202,7 @@ void hpsb_cleanup_config_roms(void) } } /* Add extra config roms to specified host */ int hpsb_add_extra_config_roms(struct hpsb_host *host) { int i, error = 0; Loading @@ -219,6 +221,7 @@ int hpsb_add_extra_config_roms(struct hpsb_host *host) return error; } /* Remove extra config roms from specified host */ void hpsb_remove_extra_config_roms(struct hpsb_host *host) { int i; Loading drivers/ieee1394/config_roms.h +0 −10 Original line number Diff line number Diff line Loading @@ -4,22 +4,12 @@ #include "ieee1394_types.h" #include "hosts.h" /* The default host entry. This must succeed. */ int hpsb_default_host_entry(struct hpsb_host *host); /* Initialize all config roms */ int hpsb_init_config_roms(void); /* Cleanup all config roms */ void hpsb_cleanup_config_roms(void); /* Add extra config roms to specified host */ int hpsb_add_extra_config_roms(struct hpsb_host *host); /* Remove extra config roms from specified host */ void hpsb_remove_extra_config_roms(struct hpsb_host *host); /* List of flags to check if a host contains a certain extra config rom * entry. Available in the host->config_roms member. */ #define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001 Loading drivers/ieee1394/dma.c +24 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,9 @@ void dma_prog_region_free(struct dma_prog_region *prog) /* dma_region */ /** * dma_region_init - clear out all fields but do not allocate anything */ void dma_region_init(struct dma_region *dma) { dma->kvirt = NULL; Loading @@ -71,6 +74,9 @@ void dma_region_init(struct dma_region *dma) dma->sglist = NULL; } /** * dma_region_alloc - allocate the buffer and map it to the IOMMU */ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction) { Loading Loading @@ -128,6 +134,9 @@ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, return -ENOMEM; } /** * dma_region_free - unmap and free the buffer */ void dma_region_free(struct dma_region *dma) { if (dma->n_dma_pages) { Loading Loading @@ -167,6 +176,12 @@ static inline int dma_region_find(struct dma_region *dma, unsigned long offset, return i; } /** * dma_region_offset_to_bus - get bus address of an offset within a DMA region * * Returns the DMA bus address of the byte with the given @offset relative to * the beginning of the @dma. */ dma_addr_t dma_region_offset_to_bus(struct dma_region * dma, unsigned long offset) { Loading @@ -177,6 +192,9 @@ dma_addr_t dma_region_offset_to_bus(struct dma_region * dma, return sg_dma_address(sg) + rem; } /** * dma_region_sync_for_cpu - sync the CPU's view of the buffer */ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len) { Loading @@ -193,6 +211,9 @@ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, dma->direction); } /** * dma_region_sync_for_device - sync the IO bus' view of the buffer */ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, unsigned long len) { Loading Loading @@ -244,6 +265,9 @@ static struct vm_operations_struct dma_region_vm_ops = { .nopage = dma_region_pagefault, }; /** * dma_region_mmap - map the buffer into a user space process */ int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma) { Loading drivers/ieee1394/dma.h +5 −17 Original line number Diff line number Diff line Loading @@ -66,35 +66,23 @@ struct dma_region { int direction; }; /* clear out all fields but do not allocate anything */ void dma_region_init(struct dma_region *dma); /* allocate the buffer and map it to the IOMMU */ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction); /* unmap and free the buffer */ void dma_region_free(struct dma_region *dma); /* sync the CPU's view of the buffer */ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len); /* sync the IO bus' view of the buffer */ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, unsigned long len); /* map the buffer into a user space process */ int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma); dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset); /* macro to index into a DMA region (or dma_prog_region) */ /** * dma_region_i - macro to index into a DMA region (or dma_prog_region) */ #define dma_region_i(_dma, _type, _index) \ ( ((_type*) ((_dma)->kvirt)) + (_index) ) /* return the DMA bus address of the byte with the given offset * relative to the beginning of the dma_region */ dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset); #endif /* IEEE1394_DMA_H */ drivers/ieee1394/highlevel.c +86 −3 Original line number Diff line number Diff line Loading @@ -70,8 +70,12 @@ static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, return NULL; } /* Returns a per host/driver data structure that was previously stored by * hpsb_create_hostinfo. */ /** * hpsb_get_hostinfo - retrieve a hostinfo pointer bound to this driver/host * * Returns a per @host and @hl driver data structure that was previously stored * by hpsb_create_hostinfo. */ void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { struct hl_host_info *hi = hl_get_hostinfo(hl, host); Loading @@ -79,7 +83,13 @@ void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) return hi ? hi->data : NULL; } /* If size is zero, then the return here is only valid for error checking */ /** * hpsb_create_hostinfo - allocate a hostinfo pointer bound to this driver/host * * Allocate a hostinfo pointer backed by memory with @data_size and bind it to * to this @hl driver and @host. If @data_size is zero, then the return here is * only valid for error checking. */ void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, size_t data_size) { Loading Loading @@ -113,6 +123,11 @@ void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, return data; } /** * hpsb_set_hostinfo - set the hostinfo pointer to something useful * * Usually follows a call to hpsb_create_hostinfo, where the size is 0. */ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *data) { Loading @@ -132,6 +147,11 @@ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, return -EINVAL; } /** * hpsb_destroy_hostinfo - free and remove a hostinfo pointer * * Free and remove the hostinfo pointer bound to this @hl driver and @host. */ void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { struct hl_host_info *hi; Loading @@ -147,6 +167,12 @@ void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) return; } /** * hpsb_set_hostinfo_key - set an alternate lookup key for an hostinfo * * Sets an alternate lookup key for the hostinfo bound to this @hl driver and * @host. */ void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned long key) { Loading @@ -158,6 +184,9 @@ void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, return; } /** * hpsb_get_hostinfo_bykey - retrieve a hostinfo pointer by its alternate key */ void *hpsb_get_hostinfo_bykey(struct hpsb_highlevel *hl, unsigned long key) { struct hl_host_info *hi; Loading Loading @@ -189,6 +218,12 @@ static int highlevel_for_each_host_reg(struct hpsb_host *host, void *__data) return 0; } /** * hpsb_register_highlevel - register highlevel driver * * The name pointer in @hl has to stay valid at all times because the string is * not copied. */ void hpsb_register_highlevel(struct hpsb_highlevel *hl) { unsigned long flags; Loading Loading @@ -258,6 +293,9 @@ static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data) return 0; } /** * hpsb_unregister_highlevel - unregister highlevel driver */ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl) { unsigned long flags; Loading @@ -273,6 +311,19 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl) nodemgr_for_each_host(hl, highlevel_for_each_host_unreg); } /** * hpsb_allocate_and_register_addrspace - alloc' and reg' a host address space * * @start and @end are 48 bit pointers and have to be quadlet aligned. * @end points to the first address behind the handled addresses. This * function can be called multiple times for a single hpsb_highlevel @hl to * implement sparse register sets. The requested region must not overlap any * previously allocated region, otherwise registering will fail. * * It returns true for successful allocation. Address spaces can be * unregistered with hpsb_unregister_addrspace. All remaining address spaces * are automatically deallocated together with the hpsb_highlevel @hl. */ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, struct hpsb_address_ops *ops, Loading Loading @@ -348,6 +399,19 @@ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, return retval; } /** * hpsb_register_addrspace - register a host address space * * @start and @end are 48 bit pointers and have to be quadlet aligned. * @end points to the first address behind the handled addresses. This * function can be called multiple times for a single hpsb_highlevel @hl to * implement sparse register sets. The requested region must not overlap any * previously allocated region, otherwise registering will fail. * * It returns true for successful allocation. Address spaces can be * unregistered with hpsb_unregister_addrspace. All remaining address spaces * are automatically deallocated together with the hpsb_highlevel @hl. */ int hpsb_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, struct hpsb_address_ops *ops, u64 start, u64 end) { Loading Loading @@ -419,6 +483,11 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, return retval; } /** * hpsb_listen_channel - enable receving a certain isochronous channel * * Reception is handled through the @hl's iso_receive op. */ int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel) { Loading @@ -431,6 +500,9 @@ int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, return 0; } /** * hpsb_unlisten_channel - disable receving a certain isochronous channel */ void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel) { Loading Loading @@ -528,6 +600,17 @@ void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, read_unlock_irqrestore(&hl_irqs_lock, flags); } /* * highlevel_read, highlevel_write, highlevel_lock, highlevel_lock64: * * These functions are called to handle transactions. They are called when a * packet arrives. The flags argument contains the second word of the first * header quadlet of the incoming packet (containing transaction label, retry * code, transaction code and priority). These functions either return a * response code or a negative number. In the first case a response will be * generated. In the latter case, no response will be sent and the driver which * handled the request will send the response itself. */ int highlevel_read(struct hpsb_host *host, int nodeid, void *data, u64 addr, unsigned int length, u16 flags) { Loading Loading
drivers/ieee1394/config_roms.c +5 −2 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ struct hpsb_config_rom_entry { unsigned int flag; }; /* The default host entry. This must succeed. */ int hpsb_default_host_entry(struct hpsb_host *host) { struct csr1212_keyval *root; Loading Loading @@ -170,7 +170,7 @@ static struct hpsb_config_rom_entry *const config_rom_entries[] = { NULL, }; /* Initialize all config roms */ int hpsb_init_config_roms(void) { int i, error = 0; Loading @@ -191,6 +191,7 @@ int hpsb_init_config_roms(void) return error; } /* Cleanup all config roms */ void hpsb_cleanup_config_roms(void) { int i; Loading @@ -201,6 +202,7 @@ void hpsb_cleanup_config_roms(void) } } /* Add extra config roms to specified host */ int hpsb_add_extra_config_roms(struct hpsb_host *host) { int i, error = 0; Loading @@ -219,6 +221,7 @@ int hpsb_add_extra_config_roms(struct hpsb_host *host) return error; } /* Remove extra config roms from specified host */ void hpsb_remove_extra_config_roms(struct hpsb_host *host) { int i; Loading
drivers/ieee1394/config_roms.h +0 −10 Original line number Diff line number Diff line Loading @@ -4,22 +4,12 @@ #include "ieee1394_types.h" #include "hosts.h" /* The default host entry. This must succeed. */ int hpsb_default_host_entry(struct hpsb_host *host); /* Initialize all config roms */ int hpsb_init_config_roms(void); /* Cleanup all config roms */ void hpsb_cleanup_config_roms(void); /* Add extra config roms to specified host */ int hpsb_add_extra_config_roms(struct hpsb_host *host); /* Remove extra config roms from specified host */ void hpsb_remove_extra_config_roms(struct hpsb_host *host); /* List of flags to check if a host contains a certain extra config rom * entry. Available in the host->config_roms member. */ #define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001 Loading
drivers/ieee1394/dma.c +24 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,9 @@ void dma_prog_region_free(struct dma_prog_region *prog) /* dma_region */ /** * dma_region_init - clear out all fields but do not allocate anything */ void dma_region_init(struct dma_region *dma) { dma->kvirt = NULL; Loading @@ -71,6 +74,9 @@ void dma_region_init(struct dma_region *dma) dma->sglist = NULL; } /** * dma_region_alloc - allocate the buffer and map it to the IOMMU */ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction) { Loading Loading @@ -128,6 +134,9 @@ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, return -ENOMEM; } /** * dma_region_free - unmap and free the buffer */ void dma_region_free(struct dma_region *dma) { if (dma->n_dma_pages) { Loading Loading @@ -167,6 +176,12 @@ static inline int dma_region_find(struct dma_region *dma, unsigned long offset, return i; } /** * dma_region_offset_to_bus - get bus address of an offset within a DMA region * * Returns the DMA bus address of the byte with the given @offset relative to * the beginning of the @dma. */ dma_addr_t dma_region_offset_to_bus(struct dma_region * dma, unsigned long offset) { Loading @@ -177,6 +192,9 @@ dma_addr_t dma_region_offset_to_bus(struct dma_region * dma, return sg_dma_address(sg) + rem; } /** * dma_region_sync_for_cpu - sync the CPU's view of the buffer */ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len) { Loading @@ -193,6 +211,9 @@ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, dma->direction); } /** * dma_region_sync_for_device - sync the IO bus' view of the buffer */ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, unsigned long len) { Loading Loading @@ -244,6 +265,9 @@ static struct vm_operations_struct dma_region_vm_ops = { .nopage = dma_region_pagefault, }; /** * dma_region_mmap - map the buffer into a user space process */ int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma) { Loading
drivers/ieee1394/dma.h +5 −17 Original line number Diff line number Diff line Loading @@ -66,35 +66,23 @@ struct dma_region { int direction; }; /* clear out all fields but do not allocate anything */ void dma_region_init(struct dma_region *dma); /* allocate the buffer and map it to the IOMMU */ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction); /* unmap and free the buffer */ void dma_region_free(struct dma_region *dma); /* sync the CPU's view of the buffer */ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len); /* sync the IO bus' view of the buffer */ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, unsigned long len); /* map the buffer into a user space process */ int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma); dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset); /* macro to index into a DMA region (or dma_prog_region) */ /** * dma_region_i - macro to index into a DMA region (or dma_prog_region) */ #define dma_region_i(_dma, _type, _index) \ ( ((_type*) ((_dma)->kvirt)) + (_index) ) /* return the DMA bus address of the byte with the given offset * relative to the beginning of the dma_region */ dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset); #endif /* IEEE1394_DMA_H */
drivers/ieee1394/highlevel.c +86 −3 Original line number Diff line number Diff line Loading @@ -70,8 +70,12 @@ static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, return NULL; } /* Returns a per host/driver data structure that was previously stored by * hpsb_create_hostinfo. */ /** * hpsb_get_hostinfo - retrieve a hostinfo pointer bound to this driver/host * * Returns a per @host and @hl driver data structure that was previously stored * by hpsb_create_hostinfo. */ void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { struct hl_host_info *hi = hl_get_hostinfo(hl, host); Loading @@ -79,7 +83,13 @@ void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) return hi ? hi->data : NULL; } /* If size is zero, then the return here is only valid for error checking */ /** * hpsb_create_hostinfo - allocate a hostinfo pointer bound to this driver/host * * Allocate a hostinfo pointer backed by memory with @data_size and bind it to * to this @hl driver and @host. If @data_size is zero, then the return here is * only valid for error checking. */ void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, size_t data_size) { Loading Loading @@ -113,6 +123,11 @@ void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, return data; } /** * hpsb_set_hostinfo - set the hostinfo pointer to something useful * * Usually follows a call to hpsb_create_hostinfo, where the size is 0. */ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *data) { Loading @@ -132,6 +147,11 @@ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, return -EINVAL; } /** * hpsb_destroy_hostinfo - free and remove a hostinfo pointer * * Free and remove the hostinfo pointer bound to this @hl driver and @host. */ void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { struct hl_host_info *hi; Loading @@ -147,6 +167,12 @@ void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) return; } /** * hpsb_set_hostinfo_key - set an alternate lookup key for an hostinfo * * Sets an alternate lookup key for the hostinfo bound to this @hl driver and * @host. */ void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned long key) { Loading @@ -158,6 +184,9 @@ void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, return; } /** * hpsb_get_hostinfo_bykey - retrieve a hostinfo pointer by its alternate key */ void *hpsb_get_hostinfo_bykey(struct hpsb_highlevel *hl, unsigned long key) { struct hl_host_info *hi; Loading Loading @@ -189,6 +218,12 @@ static int highlevel_for_each_host_reg(struct hpsb_host *host, void *__data) return 0; } /** * hpsb_register_highlevel - register highlevel driver * * The name pointer in @hl has to stay valid at all times because the string is * not copied. */ void hpsb_register_highlevel(struct hpsb_highlevel *hl) { unsigned long flags; Loading Loading @@ -258,6 +293,9 @@ static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data) return 0; } /** * hpsb_unregister_highlevel - unregister highlevel driver */ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl) { unsigned long flags; Loading @@ -273,6 +311,19 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl) nodemgr_for_each_host(hl, highlevel_for_each_host_unreg); } /** * hpsb_allocate_and_register_addrspace - alloc' and reg' a host address space * * @start and @end are 48 bit pointers and have to be quadlet aligned. * @end points to the first address behind the handled addresses. This * function can be called multiple times for a single hpsb_highlevel @hl to * implement sparse register sets. The requested region must not overlap any * previously allocated region, otherwise registering will fail. * * It returns true for successful allocation. Address spaces can be * unregistered with hpsb_unregister_addrspace. All remaining address spaces * are automatically deallocated together with the hpsb_highlevel @hl. */ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, struct hpsb_address_ops *ops, Loading Loading @@ -348,6 +399,19 @@ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, return retval; } /** * hpsb_register_addrspace - register a host address space * * @start and @end are 48 bit pointers and have to be quadlet aligned. * @end points to the first address behind the handled addresses. This * function can be called multiple times for a single hpsb_highlevel @hl to * implement sparse register sets. The requested region must not overlap any * previously allocated region, otherwise registering will fail. * * It returns true for successful allocation. Address spaces can be * unregistered with hpsb_unregister_addrspace. All remaining address spaces * are automatically deallocated together with the hpsb_highlevel @hl. */ int hpsb_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, struct hpsb_address_ops *ops, u64 start, u64 end) { Loading Loading @@ -419,6 +483,11 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, return retval; } /** * hpsb_listen_channel - enable receving a certain isochronous channel * * Reception is handled through the @hl's iso_receive op. */ int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel) { Loading @@ -431,6 +500,9 @@ int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, return 0; } /** * hpsb_unlisten_channel - disable receving a certain isochronous channel */ void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel) { Loading Loading @@ -528,6 +600,17 @@ void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, read_unlock_irqrestore(&hl_irqs_lock, flags); } /* * highlevel_read, highlevel_write, highlevel_lock, highlevel_lock64: * * These functions are called to handle transactions. They are called when a * packet arrives. The flags argument contains the second word of the first * header quadlet of the incoming packet (containing transaction label, retry * code, transaction code and priority). These functions either return a * response code or a negative number. In the first case a response will be * generated. In the latter case, no response will be sent and the driver which * handled the request will send the response itself. */ int highlevel_read(struct hpsb_host *host, int nodeid, void *data, u64 addr, unsigned int length, u16 flags) { Loading