[PATCH] PCI: clean up the MSI code a bit.

Mostly just cleans up the irq handling logic to be smaller and a bit more
descriptive as to what it really does.

Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

+39 -62
+35 -57
drivers/pci/msi.c
··· 28 static kmem_cache_t* msi_cachep; 29 30 static int pci_msi_enable = 1; 31 - static int last_alloc_vector = 0; 32 - static int nr_released_vectors = 0; 33 static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS; 34 - static int nr_msix_devices = 0; 35 36 #ifndef CONFIG_X86_IO_APIC 37 int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1}; ··· 170 return 0; /* never anything pending */ 171 } 172 173 - static void release_msi(unsigned int vector); 174 - static void shutdown_msi_irq(unsigned int vector) 175 - { 176 - release_msi(vector); 177 - } 178 - 179 - #define shutdown_msi_irq_wo_maskbit shutdown_msi_irq 180 - static void enable_msi_irq_wo_maskbit(unsigned int vector) {} 181 - static void disable_msi_irq_wo_maskbit(unsigned int vector) {} 182 - static void ack_msi_irq_wo_maskbit(unsigned int vector) {} 183 - static void end_msi_irq_wo_maskbit(unsigned int vector) 184 - { 185 - move_msi(vector); 186 - ack_APIC_irq(); 187 - } 188 - 189 static unsigned int startup_msi_irq_w_maskbit(unsigned int vector) 190 { 191 struct msi_desc *entry; 192 unsigned long flags; 193 194 spin_lock_irqsave(&msi_lock, flags); 195 entry = msi_desc[vector]; 196 - if (!entry || !entry->dev) { 197 - spin_unlock_irqrestore(&msi_lock, flags); 198 - return 0; 199 - } 200 - entry->msi_attrib.state = 1; /* Mark it active */ 201 spin_unlock_irqrestore(&msi_lock, flags); 202 - 203 - unmask_MSI_irq(vector); 204 - return 0; /* never anything pending */ 205 } 206 207 - #define shutdown_msi_irq_w_maskbit shutdown_msi_irq 208 - #define enable_msi_irq_w_maskbit unmask_MSI_irq 209 - #define disable_msi_irq_w_maskbit mask_MSI_irq 210 - #define ack_msi_irq_w_maskbit mask_MSI_irq 211 212 static void end_msi_irq_w_maskbit(unsigned int vector) 213 { 214 move_msi(vector); 215 unmask_MSI_irq(vector); 216 ack_APIC_irq(); 217 } 218 219 /* ··· 213 static struct hw_interrupt_type msix_irq_type = { 214 .typename = "PCI-MSI-X", 215 .startup = startup_msi_irq_w_maskbit, 216 - .shutdown = shutdown_msi_irq_w_maskbit, 217 - .enable = enable_msi_irq_w_maskbit, 218 - .disable = disable_msi_irq_w_maskbit, 219 - .ack = ack_msi_irq_w_maskbit, 220 .end = end_msi_irq_w_maskbit, 221 .set_affinity = set_msi_irq_affinity 222 }; ··· 229 static struct hw_interrupt_type msi_irq_w_maskbit_type = { 230 .typename = "PCI-MSI", 231 .startup = startup_msi_irq_w_maskbit, 232 - .shutdown = shutdown_msi_irq_w_maskbit, 233 - .enable = enable_msi_irq_w_maskbit, 234 - .disable = disable_msi_irq_w_maskbit, 235 - .ack = ack_msi_irq_w_maskbit, 236 .end = end_msi_irq_w_maskbit, 237 .set_affinity = set_msi_irq_affinity 238 }; ··· 245 static struct hw_interrupt_type msi_irq_wo_maskbit_type = { 246 .typename = "PCI-MSI", 247 .startup = startup_msi_irq_wo_maskbit, 248 - .shutdown = shutdown_msi_irq_wo_maskbit, 249 - .enable = enable_msi_irq_wo_maskbit, 250 - .disable = disable_msi_irq_wo_maskbit, 251 - .ack = ack_msi_irq_wo_maskbit, 252 .end = end_msi_irq_wo_maskbit, 253 .set_affinity = set_msi_irq_affinity 254 }; ··· 397 { 398 struct msi_desc *entry; 399 400 - entry = (struct msi_desc*) kmem_cache_alloc(msi_cachep, SLAB_KERNEL); 401 if (!entry) 402 return NULL; 403 ··· 786 } 787 } 788 789 - static void release_msi(unsigned int vector) 790 - { 791 - struct msi_desc *entry; 792 - unsigned long flags; 793 - 794 - spin_lock_irqsave(&msi_lock, flags); 795 - entry = msi_desc[vector]; 796 - if (entry && entry->dev) 797 - entry->msi_attrib.state = 0; /* Mark it not active */ 798 - spin_unlock_irqrestore(&msi_lock, flags); 799 - } 800 - 801 static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) 802 { 803 struct msi_desc *entry; ··· 902 /** 903 * pci_enable_msix - configure device's MSI-X capability structure 904 * @dev: pointer to the pci_dev data structure of MSI-X device function 905 - * @data: pointer to an array of MSI-X entries 906 * @nvec: number of MSI-X vectors requested for allocation by device driver 907 * 908 * Setup the MSI-X capability structure of device function with the number
··· 28 static kmem_cache_t* msi_cachep; 29 30 static int pci_msi_enable = 1; 31 + static int last_alloc_vector; 32 + static int nr_released_vectors; 33 static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS; 34 + static int nr_msix_devices; 35 36 #ifndef CONFIG_X86_IO_APIC 37 int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1}; ··· 170 return 0; /* never anything pending */ 171 } 172 173 static unsigned int startup_msi_irq_w_maskbit(unsigned int vector) 174 + { 175 + startup_msi_irq_wo_maskbit(vector); 176 + unmask_MSI_irq(vector); 177 + return 0; /* never anything pending */ 178 + } 179 + 180 + static void shutdown_msi_irq(unsigned int vector) 181 { 182 struct msi_desc *entry; 183 unsigned long flags; 184 185 spin_lock_irqsave(&msi_lock, flags); 186 entry = msi_desc[vector]; 187 + if (entry && entry->dev) 188 + entry->msi_attrib.state = 0; /* Mark it not active */ 189 spin_unlock_irqrestore(&msi_lock, flags); 190 } 191 192 + static void end_msi_irq_wo_maskbit(unsigned int vector) 193 + { 194 + move_msi(vector); 195 + ack_APIC_irq(); 196 + } 197 198 static void end_msi_irq_w_maskbit(unsigned int vector) 199 { 200 move_msi(vector); 201 unmask_MSI_irq(vector); 202 ack_APIC_irq(); 203 + } 204 + 205 + static void do_nothing(unsigned int vector) 206 + { 207 } 208 209 /* ··· 223 static struct hw_interrupt_type msix_irq_type = { 224 .typename = "PCI-MSI-X", 225 .startup = startup_msi_irq_w_maskbit, 226 + .shutdown = shutdown_msi_irq, 227 + .enable = unmask_MSI_irq, 228 + .disable = mask_MSI_irq, 229 + .ack = mask_MSI_irq, 230 .end = end_msi_irq_w_maskbit, 231 .set_affinity = set_msi_irq_affinity 232 }; ··· 239 static struct hw_interrupt_type msi_irq_w_maskbit_type = { 240 .typename = "PCI-MSI", 241 .startup = startup_msi_irq_w_maskbit, 242 + .shutdown = shutdown_msi_irq, 243 + .enable = unmask_MSI_irq, 244 + .disable = mask_MSI_irq, 245 + .ack = mask_MSI_irq, 246 .end = end_msi_irq_w_maskbit, 247 .set_affinity = set_msi_irq_affinity 248 }; ··· 255 static struct hw_interrupt_type msi_irq_wo_maskbit_type = { 256 .typename = "PCI-MSI", 257 .startup = startup_msi_irq_wo_maskbit, 258 + .shutdown = shutdown_msi_irq, 259 + .enable = do_nothing, 260 + .disable = do_nothing, 261 + .ack = do_nothing, 262 .end = end_msi_irq_wo_maskbit, 263 .set_affinity = set_msi_irq_affinity 264 }; ··· 407 { 408 struct msi_desc *entry; 409 410 + entry = kmem_cache_alloc(msi_cachep, SLAB_KERNEL); 411 if (!entry) 412 return NULL; 413 ··· 796 } 797 } 798 799 static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) 800 { 801 struct msi_desc *entry; ··· 924 /** 925 * pci_enable_msix - configure device's MSI-X capability structure 926 * @dev: pointer to the pci_dev data structure of MSI-X device function 927 + * @entries: pointer to an array of MSI-X entries 928 * @nvec: number of MSI-X vectors requested for allocation by device driver 929 * 930 * Setup the MSI-X capability structure of device function with the number
+4 -5
drivers/pci/msi.h
··· 41 #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) 42 #define PCI_MSIX_FLAGS_BITMASK (1 << 0) 43 44 - #define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0 45 - #define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4 46 - #define PCI_MSIX_ENTRY_DATA_OFFSET 8 47 - #define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET 12 48 #define PCI_MSIX_ENTRY_SIZE 16 49 50 #define msi_control_reg(base) (base + PCI_MSI_FLAGS) 51 #define msi_lower_address_reg(base) (base + PCI_MSI_ADDRESS_LO) ··· 64 #define msi_enable(control, num) multi_msi_enable(control, num); \ 65 control |= PCI_MSI_FLAGS_ENABLE 66 67 - #define msix_control_reg msi_control_reg 68 #define msix_table_offset_reg(base) (base + 0x04) 69 #define msix_pba_offset_reg(base) (base + 0x08) 70 #define msix_enable(control) control |= PCI_MSIX_FLAGS_ENABLE
··· 41 #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) 42 #define PCI_MSIX_FLAGS_BITMASK (1 << 0) 43 44 #define PCI_MSIX_ENTRY_SIZE 16 45 + #define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0 46 + #define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4 47 + #define PCI_MSIX_ENTRY_DATA_OFFSET 8 48 + #define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET 12 49 50 #define msi_control_reg(base) (base + PCI_MSI_FLAGS) 51 #define msi_lower_address_reg(base) (base + PCI_MSI_ADDRESS_LO) ··· 64 #define msi_enable(control, num) multi_msi_enable(control, num); \ 65 control |= PCI_MSI_FLAGS_ENABLE 66 67 #define msix_table_offset_reg(base) (base + 0x04) 68 #define msix_pba_offset_reg(base) (base + 0x08) 69 #define msix_enable(control) control |= PCI_MSIX_FLAGS_ENABLE