diff options
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_kernel.h')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 204 |
1 files changed, 150 insertions, 54 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 8786dd7922e4..4cc0f95ea877 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/interrupt.h> | 41 | #include <linux/interrupt.h> |
42 | #include <linux/pci.h> | 42 | #include <linux/pci.h> |
43 | #include <linux/dma-mapping.h> | 43 | #include <linux/dma-mapping.h> |
44 | #include <linux/mutex.h> | ||
44 | #include <asm/io.h> | 45 | #include <asm/io.h> |
45 | #include <rdma/ib_verbs.h> | 46 | #include <rdma/ib_verbs.h> |
46 | 47 | ||
@@ -140,6 +141,11 @@ struct ipath_portdata { | |||
140 | u32 port_pionowait; | 141 | u32 port_pionowait; |
141 | /* total number of rcvhdrqfull errors */ | 142 | /* total number of rcvhdrqfull errors */ |
142 | u32 port_hdrqfull; | 143 | u32 port_hdrqfull; |
144 | /* | ||
145 | * Used to suppress multiple instances of same | ||
146 | * port staying stuck at same point. | ||
147 | */ | ||
148 | u32 port_lastrcvhdrqtail; | ||
143 | /* saved total number of rcvhdrqfull errors for poll edge trigger */ | 149 | /* saved total number of rcvhdrqfull errors for poll edge trigger */ |
144 | u32 port_hdrqfull_poll; | 150 | u32 port_hdrqfull_poll; |
145 | /* total number of polled urgent packets */ | 151 | /* total number of polled urgent packets */ |
@@ -148,6 +154,7 @@ struct ipath_portdata { | |||
148 | u32 port_urgent_poll; | 154 | u32 port_urgent_poll; |
149 | /* pid of process using this port */ | 155 | /* pid of process using this port */ |
150 | pid_t port_pid; | 156 | pid_t port_pid; |
157 | pid_t port_subpid[INFINIPATH_MAX_SUBPORT]; | ||
151 | /* same size as task_struct .comm[] */ | 158 | /* same size as task_struct .comm[] */ |
152 | char port_comm[16]; | 159 | char port_comm[16]; |
153 | /* pkeys set by this use of this port */ | 160 | /* pkeys set by this use of this port */ |
@@ -166,6 +173,8 @@ struct ipath_portdata { | |||
166 | u32 active_slaves; | 173 | u32 active_slaves; |
167 | /* Type of packets or conditions we want to poll for */ | 174 | /* Type of packets or conditions we want to poll for */ |
168 | u16 poll_type; | 175 | u16 poll_type; |
176 | /* port rcvhdrq head offset */ | ||
177 | u32 port_head; | ||
169 | }; | 178 | }; |
170 | 179 | ||
171 | struct sk_buff; | 180 | struct sk_buff; |
@@ -182,6 +191,22 @@ struct ipath_skbinfo { | |||
182 | dma_addr_t phys; | 191 | dma_addr_t phys; |
183 | }; | 192 | }; |
184 | 193 | ||
194 | /* | ||
195 | * Possible IB config parameters for ipath_f_get/set_ib_cfg() | ||
196 | */ | ||
197 | #define IPATH_IB_CFG_LIDLMC 0 /* Get/set LID (LS16b) and Mask (MS16b) */ | ||
198 | #define IPATH_IB_CFG_HRTBT 1 /* Get/set Heartbeat off/enable/auto */ | ||
199 | #define IPATH_IB_HRTBT_ON 3 /* Heartbeat enabled, sent every 100msec */ | ||
200 | #define IPATH_IB_HRTBT_OFF 0 /* Heartbeat off */ | ||
201 | #define IPATH_IB_CFG_LWID_ENB 2 /* Get/set allowed Link-width */ | ||
202 | #define IPATH_IB_CFG_LWID 3 /* Get currently active Link-width */ | ||
203 | #define IPATH_IB_CFG_SPD_ENB 4 /* Get/set allowed Link speeds */ | ||
204 | #define IPATH_IB_CFG_SPD 5 /* Get current Link spd */ | ||
205 | #define IPATH_IB_CFG_RXPOL_ENB 6 /* Get/set Auto-RX-polarity enable */ | ||
206 | #define IPATH_IB_CFG_LREV_ENB 7 /* Get/set Auto-Lane-reversal enable */ | ||
207 | #define IPATH_IB_CFG_LINKLATENCY 8 /* Get Auto-Lane-reversal enable */ | ||
208 | |||
209 | |||
185 | struct ipath_devdata { | 210 | struct ipath_devdata { |
186 | struct list_head ipath_list; | 211 | struct list_head ipath_list; |
187 | 212 | ||
@@ -222,6 +247,8 @@ struct ipath_devdata { | |||
222 | struct _ipath_layer ipath_layer; | 247 | struct _ipath_layer ipath_layer; |
223 | /* setup intr */ | 248 | /* setup intr */ |
224 | int (*ipath_f_intrsetup)(struct ipath_devdata *); | 249 | int (*ipath_f_intrsetup)(struct ipath_devdata *); |
250 | /* fallback to alternate interrupt type if possible */ | ||
251 | int (*ipath_f_intr_fallback)(struct ipath_devdata *); | ||
225 | /* setup on-chip bus config */ | 252 | /* setup on-chip bus config */ |
226 | int (*ipath_f_bus)(struct ipath_devdata *, struct pci_dev *); | 253 | int (*ipath_f_bus)(struct ipath_devdata *, struct pci_dev *); |
227 | /* hard reset chip */ | 254 | /* hard reset chip */ |
@@ -244,6 +271,18 @@ struct ipath_devdata { | |||
244 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); | 271 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); |
245 | /* free irq */ | 272 | /* free irq */ |
246 | void (*ipath_f_free_irq)(struct ipath_devdata *); | 273 | void (*ipath_f_free_irq)(struct ipath_devdata *); |
274 | struct ipath_message_header *(*ipath_f_get_msgheader) | ||
275 | (struct ipath_devdata *, __le32 *); | ||
276 | void (*ipath_f_config_ports)(struct ipath_devdata *, ushort); | ||
277 | int (*ipath_f_get_ib_cfg)(struct ipath_devdata *, int); | ||
278 | int (*ipath_f_set_ib_cfg)(struct ipath_devdata *, int, u32); | ||
279 | void (*ipath_f_config_jint)(struct ipath_devdata *, u16 , u16); | ||
280 | void (*ipath_f_read_counters)(struct ipath_devdata *, | ||
281 | struct infinipath_counters *); | ||
282 | void (*ipath_f_xgxs_reset)(struct ipath_devdata *); | ||
283 | /* per chip actions needed for IB Link up/down changes */ | ||
284 | int (*ipath_f_ib_updown)(struct ipath_devdata *, int, u64); | ||
285 | |||
247 | struct ipath_ibdev *verbs_dev; | 286 | struct ipath_ibdev *verbs_dev; |
248 | struct timer_list verbs_timer; | 287 | struct timer_list verbs_timer; |
249 | /* total dwords sent (summed from counter) */ | 288 | /* total dwords sent (summed from counter) */ |
@@ -313,22 +352,12 @@ struct ipath_devdata { | |||
313 | * supports, less gives more pio bufs/port, etc. | 352 | * supports, less gives more pio bufs/port, etc. |
314 | */ | 353 | */ |
315 | u32 ipath_cfgports; | 354 | u32 ipath_cfgports; |
316 | /* port0 rcvhdrq head offset */ | ||
317 | u32 ipath_port0head; | ||
318 | /* count of port 0 hdrqfull errors */ | 355 | /* count of port 0 hdrqfull errors */ |
319 | u32 ipath_p0_hdrqfull; | 356 | u32 ipath_p0_hdrqfull; |
357 | /* port 0 number of receive eager buffers */ | ||
358 | u32 ipath_p0_rcvegrcnt; | ||
320 | 359 | ||
321 | /* | 360 | /* |
322 | * (*cfgports) used to suppress multiple instances of same | ||
323 | * port staying stuck at same point | ||
324 | */ | ||
325 | u32 *ipath_lastrcvhdrqtails; | ||
326 | /* | ||
327 | * (*cfgports) used to suppress multiple instances of same | ||
328 | * port staying stuck at same point | ||
329 | */ | ||
330 | u32 *ipath_lastegrheads; | ||
331 | /* | ||
332 | * index of last piobuffer we used. Speeds up searching, by | 361 | * index of last piobuffer we used. Speeds up searching, by |
333 | * starting at this point. Doesn't matter if multiple cpu's use and | 362 | * starting at this point. Doesn't matter if multiple cpu's use and |
334 | * update, last updater is only write that matters. Whenever it | 363 | * update, last updater is only write that matters. Whenever it |
@@ -367,14 +396,15 @@ struct ipath_devdata { | |||
367 | unsigned long ipath_wc_len; | 396 | unsigned long ipath_wc_len; |
368 | /* ref count for each pkey */ | 397 | /* ref count for each pkey */ |
369 | atomic_t ipath_pkeyrefs[4]; | 398 | atomic_t ipath_pkeyrefs[4]; |
370 | /* shadow copy of all exptids physaddr; used only by funcsim */ | ||
371 | u64 *ipath_tidsimshadow; | ||
372 | /* shadow copy of struct page *'s for exp tid pages */ | 399 | /* shadow copy of struct page *'s for exp tid pages */ |
373 | struct page **ipath_pageshadow; | 400 | struct page **ipath_pageshadow; |
374 | /* shadow copy of dma handles for exp tid pages */ | 401 | /* shadow copy of dma handles for exp tid pages */ |
375 | dma_addr_t *ipath_physshadow; | 402 | dma_addr_t *ipath_physshadow; |
376 | /* lock to workaround chip bug 9437 */ | 403 | u64 __iomem *ipath_egrtidbase; |
404 | /* lock to workaround chip bug 9437 and others */ | ||
405 | spinlock_t ipath_kernel_tid_lock; | ||
377 | spinlock_t ipath_tid_lock; | 406 | spinlock_t ipath_tid_lock; |
407 | spinlock_t ipath_sendctrl_lock; | ||
378 | 408 | ||
379 | /* | 409 | /* |
380 | * IPATH_STATUS_*, | 410 | * IPATH_STATUS_*, |
@@ -395,6 +425,8 @@ struct ipath_devdata { | |||
395 | void *ipath_dummy_hdrq; /* used after port close */ | 425 | void *ipath_dummy_hdrq; /* used after port close */ |
396 | dma_addr_t ipath_dummy_hdrq_phys; | 426 | dma_addr_t ipath_dummy_hdrq_phys; |
397 | 427 | ||
428 | unsigned long ipath_ureg_align; /* user register alignment */ | ||
429 | |||
398 | /* | 430 | /* |
399 | * Shadow copies of registers; size indicates read access size. | 431 | * Shadow copies of registers; size indicates read access size. |
400 | * Most of them are readonly, but some are write-only register, | 432 | * Most of them are readonly, but some are write-only register, |
@@ -456,8 +488,6 @@ struct ipath_devdata { | |||
456 | unsigned long ipath_rcvctrl; | 488 | unsigned long ipath_rcvctrl; |
457 | /* shadow kr_sendctrl */ | 489 | /* shadow kr_sendctrl */ |
458 | unsigned long ipath_sendctrl; | 490 | unsigned long ipath_sendctrl; |
459 | /* ports waiting for PIOavail intr */ | ||
460 | unsigned long ipath_portpiowait; | ||
461 | unsigned long ipath_lastcancel; /* to not count armlaunch after cancel */ | 491 | unsigned long ipath_lastcancel; /* to not count armlaunch after cancel */ |
462 | 492 | ||
463 | /* value we put in kr_rcvhdrcnt */ | 493 | /* value we put in kr_rcvhdrcnt */ |
@@ -550,12 +580,26 @@ struct ipath_devdata { | |||
550 | u8 ipath_minrev; | 580 | u8 ipath_minrev; |
551 | /* board rev, from ipath_revision */ | 581 | /* board rev, from ipath_revision */ |
552 | u8 ipath_boardrev; | 582 | u8 ipath_boardrev; |
583 | |||
584 | u8 ipath_r_portenable_shift; | ||
585 | u8 ipath_r_intravail_shift; | ||
586 | u8 ipath_r_tailupd_shift; | ||
587 | u8 ipath_r_portcfg_shift; | ||
588 | |||
553 | /* unit # of this chip, if present */ | 589 | /* unit # of this chip, if present */ |
554 | int ipath_unit; | 590 | int ipath_unit; |
555 | /* saved for restore after reset */ | 591 | /* saved for restore after reset */ |
556 | u8 ipath_pci_cacheline; | 592 | u8 ipath_pci_cacheline; |
557 | /* LID mask control */ | 593 | /* LID mask control */ |
558 | u8 ipath_lmc; | 594 | u8 ipath_lmc; |
595 | /* link width supported */ | ||
596 | u8 ipath_link_width_supported; | ||
597 | /* link speed supported */ | ||
598 | u8 ipath_link_speed_supported; | ||
599 | u8 ipath_link_width_enabled; | ||
600 | u8 ipath_link_speed_enabled; | ||
601 | u8 ipath_link_width_active; | ||
602 | u8 ipath_link_speed_active; | ||
559 | /* Rx Polarity inversion (compensate for ~tx on partner) */ | 603 | /* Rx Polarity inversion (compensate for ~tx on partner) */ |
560 | u8 ipath_rx_pol_inv; | 604 | u8 ipath_rx_pol_inv; |
561 | 605 | ||
@@ -590,6 +634,8 @@ struct ipath_devdata { | |||
590 | */ | 634 | */ |
591 | u32 ipath_i_rcvavail_mask; | 635 | u32 ipath_i_rcvavail_mask; |
592 | u32 ipath_i_rcvurg_mask; | 636 | u32 ipath_i_rcvurg_mask; |
637 | u16 ipath_i_rcvurg_shift; | ||
638 | u16 ipath_i_rcvavail_shift; | ||
593 | 639 | ||
594 | /* | 640 | /* |
595 | * Register bits for selecting i2c direction and values, used for | 641 | * Register bits for selecting i2c direction and values, used for |
@@ -603,6 +649,29 @@ struct ipath_devdata { | |||
603 | /* lock for doing RMW of shadows/regs for ExtCtrl and GPIO */ | 649 | /* lock for doing RMW of shadows/regs for ExtCtrl and GPIO */ |
604 | spinlock_t ipath_gpio_lock; | 650 | spinlock_t ipath_gpio_lock; |
605 | 651 | ||
652 | /* | ||
653 | * IB link and linktraining states and masks that vary per chip in | ||
654 | * some way. Set at init, to avoid each IB status change interrupt | ||
655 | */ | ||
656 | u8 ibcs_ls_shift; | ||
657 | u8 ibcs_lts_mask; | ||
658 | u32 ibcs_mask; | ||
659 | u32 ib_init; | ||
660 | u32 ib_arm; | ||
661 | u32 ib_active; | ||
662 | |||
663 | u16 ipath_rhf_offset; /* offset of RHF within receive header entry */ | ||
664 | |||
665 | /* | ||
666 | * shift/mask for linkcmd, linkinitcmd, maxpktlen in ibccontol | ||
667 | * reg. Changes for IBA7220 | ||
668 | */ | ||
669 | u8 ibcc_lic_mask; /* LinkInitCmd */ | ||
670 | u8 ibcc_lc_shift; /* LinkCmd */ | ||
671 | u8 ibcc_mpl_shift; /* Maxpktlen */ | ||
672 | |||
673 | u8 delay_mult; | ||
674 | |||
606 | /* used to override LED behavior */ | 675 | /* used to override LED behavior */ |
607 | u8 ipath_led_override; /* Substituted for normal value, if non-zero */ | 676 | u8 ipath_led_override; /* Substituted for normal value, if non-zero */ |
608 | u16 ipath_led_override_timeoff; /* delta to next timer event */ | 677 | u16 ipath_led_override_timeoff; /* delta to next timer event */ |
@@ -616,7 +685,7 @@ struct ipath_devdata { | |||
616 | /* control access to actual counters, timer */ | 685 | /* control access to actual counters, timer */ |
617 | spinlock_t ipath_eep_st_lock; | 686 | spinlock_t ipath_eep_st_lock; |
618 | /* control high-level access to EEPROM */ | 687 | /* control high-level access to EEPROM */ |
619 | struct semaphore ipath_eep_sem; | 688 | struct mutex ipath_eep_lock; |
620 | /* Below inc'd by ipath_snap_cntrs(), locked by ipath_eep_st_lock */ | 689 | /* Below inc'd by ipath_snap_cntrs(), locked by ipath_eep_st_lock */ |
621 | uint64_t ipath_traffic_wds; | 690 | uint64_t ipath_traffic_wds; |
622 | /* active time is kept in seconds, but logged in hours */ | 691 | /* active time is kept in seconds, but logged in hours */ |
@@ -630,6 +699,10 @@ struct ipath_devdata { | |||
630 | * each of the counters to increment. | 699 | * each of the counters to increment. |
631 | */ | 700 | */ |
632 | struct ipath_eep_log_mask ipath_eep_st_masks[IPATH_EEP_LOG_CNT]; | 701 | struct ipath_eep_log_mask ipath_eep_st_masks[IPATH_EEP_LOG_CNT]; |
702 | |||
703 | /* interrupt mitigation reload register info */ | ||
704 | u16 ipath_jint_idle_ticks; /* idle clock ticks */ | ||
705 | u16 ipath_jint_max_packets; /* max packets across all ports */ | ||
633 | }; | 706 | }; |
634 | 707 | ||
635 | /* Private data for file operations */ | 708 | /* Private data for file operations */ |
@@ -690,7 +763,7 @@ void ipath_free_pddata(struct ipath_devdata *, struct ipath_portdata *); | |||
690 | 763 | ||
691 | int ipath_parse_ushort(const char *str, unsigned short *valp); | 764 | int ipath_parse_ushort(const char *str, unsigned short *valp); |
692 | 765 | ||
693 | void ipath_kreceive(struct ipath_devdata *); | 766 | void ipath_kreceive(struct ipath_portdata *); |
694 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); | 767 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); |
695 | int ipath_reset_device(int); | 768 | int ipath_reset_device(int); |
696 | void ipath_get_faststats(unsigned long); | 769 | void ipath_get_faststats(unsigned long); |
@@ -698,6 +771,8 @@ int ipath_set_linkstate(struct ipath_devdata *, u8); | |||
698 | int ipath_set_mtu(struct ipath_devdata *, u16); | 771 | int ipath_set_mtu(struct ipath_devdata *, u16); |
699 | int ipath_set_lid(struct ipath_devdata *, u32, u8); | 772 | int ipath_set_lid(struct ipath_devdata *, u32, u8); |
700 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | 773 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); |
774 | void ipath_enable_armlaunch(struct ipath_devdata *); | ||
775 | void ipath_disable_armlaunch(struct ipath_devdata *); | ||
701 | 776 | ||
702 | /* for use in system calls, where we want to know device type, etc. */ | 777 | /* for use in system calls, where we want to know device type, etc. */ |
703 | #define port_fp(fp) ((struct ipath_filedata *)(fp)->private_data)->pd | 778 | #define port_fp(fp) ((struct ipath_filedata *)(fp)->private_data)->pd |
@@ -744,9 +819,15 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | |||
744 | * are 64bit */ | 819 | * are 64bit */ |
745 | #define IPATH_32BITCOUNTERS 0x20000 | 820 | #define IPATH_32BITCOUNTERS 0x20000 |
746 | /* can miss port0 rx interrupts */ | 821 | /* can miss port0 rx interrupts */ |
822 | /* Interrupt register is 64 bits */ | ||
823 | #define IPATH_INTREG_64 0x40000 | ||
747 | #define IPATH_DISABLED 0x80000 /* administratively disabled */ | 824 | #define IPATH_DISABLED 0x80000 /* administratively disabled */ |
748 | /* Use GPIO interrupts for new counters */ | 825 | /* Use GPIO interrupts for new counters */ |
749 | #define IPATH_GPIO_ERRINTRS 0x100000 | 826 | #define IPATH_GPIO_ERRINTRS 0x100000 |
827 | #define IPATH_SWAP_PIOBUFS 0x200000 | ||
828 | /* Suppress heartbeat, even if turning off loopback */ | ||
829 | #define IPATH_NO_HRTBT 0x1000000 | ||
830 | #define IPATH_HAS_MULT_IB_SPEED 0x8000000 | ||
750 | 831 | ||
751 | /* Bits in GPIO for the added interrupts */ | 832 | /* Bits in GPIO for the added interrupts */ |
752 | #define IPATH_GPIO_PORT0_BIT 2 | 833 | #define IPATH_GPIO_PORT0_BIT 2 |
@@ -758,8 +839,6 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | |||
758 | /* portdata flag bit offsets */ | 839 | /* portdata flag bit offsets */ |
759 | /* waiting for a packet to arrive */ | 840 | /* waiting for a packet to arrive */ |
760 | #define IPATH_PORT_WAITING_RCV 2 | 841 | #define IPATH_PORT_WAITING_RCV 2 |
761 | /* waiting for a PIO buffer to be available */ | ||
762 | #define IPATH_PORT_WAITING_PIO 3 | ||
763 | /* master has not finished initializing */ | 842 | /* master has not finished initializing */ |
764 | #define IPATH_PORT_MASTER_UNINIT 4 | 843 | #define IPATH_PORT_MASTER_UNINIT 4 |
765 | /* waiting for an urgent packet to arrive */ | 844 | /* waiting for an urgent packet to arrive */ |
@@ -767,8 +846,6 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | |||
767 | 846 | ||
768 | /* free up any allocated data at closes */ | 847 | /* free up any allocated data at closes */ |
769 | void ipath_free_data(struct ipath_portdata *dd); | 848 | void ipath_free_data(struct ipath_portdata *dd); |
770 | int ipath_waitfor_mdio_cmdready(struct ipath_devdata *); | ||
771 | int ipath_waitfor_complete(struct ipath_devdata *, ipath_kreg, u64, u64 *); | ||
772 | u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *); | 849 | u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *); |
773 | void ipath_init_iba6120_funcs(struct ipath_devdata *); | 850 | void ipath_init_iba6120_funcs(struct ipath_devdata *); |
774 | void ipath_init_iba6110_funcs(struct ipath_devdata *); | 851 | void ipath_init_iba6110_funcs(struct ipath_devdata *); |
@@ -792,33 +869,6 @@ void ipath_set_led_override(struct ipath_devdata *dd, unsigned int val); | |||
792 | */ | 869 | */ |
793 | #define IPATH_DFLT_RCVHDRSIZE 9 | 870 | #define IPATH_DFLT_RCVHDRSIZE 9 |
794 | 871 | ||
795 | #define IPATH_MDIO_CMD_WRITE 1 | ||
796 | #define IPATH_MDIO_CMD_READ 2 | ||
797 | #define IPATH_MDIO_CLD_DIV 25 /* to get 2.5 Mhz mdio clock */ | ||
798 | #define IPATH_MDIO_CMDVALID 0x40000000 /* bit 30 */ | ||
799 | #define IPATH_MDIO_DATAVALID 0x80000000 /* bit 31 */ | ||
800 | #define IPATH_MDIO_CTRL_STD 0x0 | ||
801 | |||
802 | static inline u64 ipath_mdio_req(int cmd, int dev, int reg, int data) | ||
803 | { | ||
804 | return (((u64) IPATH_MDIO_CLD_DIV) << 32) | | ||
805 | (cmd << 26) | | ||
806 | (dev << 21) | | ||
807 | (reg << 16) | | ||
808 | (data & 0xFFFF); | ||
809 | } | ||
810 | |||
811 | /* signal and fifo status, in bank 31 */ | ||
812 | #define IPATH_MDIO_CTRL_XGXS_REG_8 0x8 | ||
813 | /* controls loopback, redundancy */ | ||
814 | #define IPATH_MDIO_CTRL_8355_REG_1 0x10 | ||
815 | /* premph, encdec, etc. */ | ||
816 | #define IPATH_MDIO_CTRL_8355_REG_2 0x11 | ||
817 | /* Kchars, etc. */ | ||
818 | #define IPATH_MDIO_CTRL_8355_REG_6 0x15 | ||
819 | #define IPATH_MDIO_CTRL_8355_REG_9 0x18 | ||
820 | #define IPATH_MDIO_CTRL_8355_REG_10 0x1D | ||
821 | |||
822 | int ipath_get_user_pages(unsigned long, size_t, struct page **); | 872 | int ipath_get_user_pages(unsigned long, size_t, struct page **); |
823 | void ipath_release_user_pages(struct page **, size_t); | 873 | void ipath_release_user_pages(struct page **, size_t); |
824 | void ipath_release_user_pages_on_close(struct page **, size_t); | 874 | void ipath_release_user_pages_on_close(struct page **, size_t); |
@@ -863,7 +913,7 @@ static inline u32 ipath_read_ureg32(const struct ipath_devdata *dd, | |||
863 | return readl(regno + (u64 __iomem *) | 913 | return readl(regno + (u64 __iomem *) |
864 | (dd->ipath_uregbase + | 914 | (dd->ipath_uregbase + |
865 | (char __iomem *)dd->ipath_kregbase + | 915 | (char __iomem *)dd->ipath_kregbase + |
866 | dd->ipath_palign * port)); | 916 | dd->ipath_ureg_align * port)); |
867 | } | 917 | } |
868 | 918 | ||
869 | /** | 919 | /** |
@@ -880,7 +930,7 @@ static inline void ipath_write_ureg(const struct ipath_devdata *dd, | |||
880 | { | 930 | { |
881 | u64 __iomem *ubase = (u64 __iomem *) | 931 | u64 __iomem *ubase = (u64 __iomem *) |
882 | (dd->ipath_uregbase + (char __iomem *) dd->ipath_kregbase + | 932 | (dd->ipath_uregbase + (char __iomem *) dd->ipath_kregbase + |
883 | dd->ipath_palign * port); | 933 | dd->ipath_ureg_align * port); |
884 | if (dd->ipath_kregbase) | 934 | if (dd->ipath_kregbase) |
885 | writeq(value, &ubase[regno]); | 935 | writeq(value, &ubase[regno]); |
886 | } | 936 | } |
@@ -930,6 +980,53 @@ static inline u32 ipath_read_creg32(const struct ipath_devdata *dd, | |||
930 | (char __iomem *)dd->ipath_kregbase)); | 980 | (char __iomem *)dd->ipath_kregbase)); |
931 | } | 981 | } |
932 | 982 | ||
983 | static inline void ipath_write_creg(const struct ipath_devdata *dd, | ||
984 | ipath_creg regno, u64 value) | ||
985 | { | ||
986 | if (dd->ipath_kregbase) | ||
987 | writeq(value, regno + (u64 __iomem *) | ||
988 | (dd->ipath_cregbase + | ||
989 | (char __iomem *)dd->ipath_kregbase)); | ||
990 | } | ||
991 | |||
992 | static inline void ipath_clear_rcvhdrtail(const struct ipath_portdata *pd) | ||
993 | { | ||
994 | *((u64 *) pd->port_rcvhdrtail_kvaddr) = 0ULL; | ||
995 | } | ||
996 | |||
997 | static inline u32 ipath_get_rcvhdrtail(const struct ipath_portdata *pd) | ||
998 | { | ||
999 | return (u32) le64_to_cpu(*((volatile __le64 *) | ||
1000 | pd->port_rcvhdrtail_kvaddr)); | ||
1001 | } | ||
1002 | |||
1003 | static inline u64 ipath_read_ireg(const struct ipath_devdata *dd, ipath_kreg r) | ||
1004 | { | ||
1005 | return (dd->ipath_flags & IPATH_INTREG_64) ? | ||
1006 | ipath_read_kreg64(dd, r) : ipath_read_kreg32(dd, r); | ||
1007 | } | ||
1008 | |||
1009 | /* | ||
1010 | * from contents of IBCStatus (or a saved copy), return linkstate | ||
1011 | * Report ACTIVE_DEFER as ACTIVE, because we treat them the same | ||
1012 | * everywhere, anyway (and should be, for almost all purposes). | ||
1013 | */ | ||
1014 | static inline u32 ipath_ib_linkstate(struct ipath_devdata *dd, u64 ibcs) | ||
1015 | { | ||
1016 | u32 state = (u32)(ibcs >> dd->ibcs_ls_shift) & | ||
1017 | INFINIPATH_IBCS_LINKSTATE_MASK; | ||
1018 | if (state == INFINIPATH_IBCS_L_STATE_ACT_DEFER) | ||
1019 | state = INFINIPATH_IBCS_L_STATE_ACTIVE; | ||
1020 | return state; | ||
1021 | } | ||
1022 | |||
1023 | /* from contents of IBCStatus (or a saved copy), return linktrainingstate */ | ||
1024 | static inline u32 ipath_ib_linktrstate(struct ipath_devdata *dd, u64 ibcs) | ||
1025 | { | ||
1026 | return (u32)(ibcs >> INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & | ||
1027 | dd->ibcs_lts_mask; | ||
1028 | } | ||
1029 | |||
933 | /* | 1030 | /* |
934 | * sysfs interface. | 1031 | * sysfs interface. |
935 | */ | 1032 | */ |
@@ -938,8 +1035,7 @@ struct device_driver; | |||
938 | 1035 | ||
939 | extern const char ib_ipath_version[]; | 1036 | extern const char ib_ipath_version[]; |
940 | 1037 | ||
941 | int ipath_driver_create_group(struct device_driver *); | 1038 | extern struct attribute_group *ipath_driver_attr_groups[]; |
942 | void ipath_driver_remove_group(struct device_driver *); | ||
943 | 1039 | ||
944 | int ipath_device_create_group(struct device *, struct ipath_devdata *); | 1040 | int ipath_device_create_group(struct device *, struct ipath_devdata *); |
945 | void ipath_device_remove_group(struct device *, struct ipath_devdata *); | 1041 | void ipath_device_remove_group(struct device *, struct ipath_devdata *); |