@@ -26,13 +26,16 @@ enum bcm4377_chip {
2626 BCM4377 = 0 ,
2727 BCM4378 ,
2828 BCM4387 ,
29+ BCM4388 ,
2930};
3031
3132#define BCM4377_DEVICE_ID 0x5fa0
3233#define BCM4378_DEVICE_ID 0x5f69
3334#define BCM4387_DEVICE_ID 0x5f71
35+ #define BCM4388_DEVICE_ID 0x5f72
3436
35- #define BCM4377_TIMEOUT 1000
37+ #define BCM4377_TIMEOUT msecs_to_jiffies(1000)
38+ #define BCM4377_BOOT_TIMEOUT msecs_to_jiffies(5000)
3639
3740/*
3841 * These devices only support DMA transactions inside a 32bit window
@@ -510,6 +513,7 @@ struct bcm4377_hw {
510513 u32 bar0_window1 ;
511514 u32 bar0_window2 ;
512515 u32 bar0_core2_window2 ;
516+ u32 bar2_offset ;
513517
514518 unsigned long has_bar0_core2_window2 : 1 ;
515519 unsigned long clear_pciecfg_subsystem_ctrl_bit19 : 1 ;
@@ -835,8 +839,8 @@ static irqreturn_t bcm4377_irq(int irq, void *data)
835839 struct bcm4377_data * bcm4377 = data ;
836840 u32 bootstage , rti_status ;
837841
838- bootstage = ioread32 (bcm4377 -> bar2 + BCM4377_BAR2_BOOTSTAGE );
839- rti_status = ioread32 (bcm4377 -> bar2 + BCM4377_BAR2_RTI_STATUS );
842+ bootstage = ioread32 (bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_BOOTSTAGE );
843+ rti_status = ioread32 (bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_RTI_STATUS );
840844
841845 if (bootstage != bcm4377 -> bootstage ||
842846 rti_status != bcm4377 -> rti_status ) {
@@ -1196,6 +1200,14 @@ static int bcm4387_send_calibration(struct bcm4377_data *bcm4377)
11961200 bcm4377 -> taurus_cal_size );
11971201}
11981202
1203+ static int bcm4388_send_calibration (struct bcm4377_data * bcm4377 )
1204+ {
1205+ /* Guess that these always use beamforming */
1206+ return __bcm4378_send_calibration (
1207+ bcm4377 , bcm4377 -> taurus_beamforming_cal_blob ,
1208+ bcm4377 -> taurus_beamforming_cal_size );
1209+ }
1210+
11991211static const struct firmware * bcm4377_request_blob (struct bcm4377_data * bcm4377 ,
12001212 const char * suffix )
12011213{
@@ -1819,8 +1831,8 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18191831 int ret = 0 ;
18201832 u32 bootstage , rti_status ;
18211833
1822- bootstage = ioread32 (bcm4377 -> bar2 + BCM4377_BAR2_BOOTSTAGE );
1823- rti_status = ioread32 (bcm4377 -> bar2 + BCM4377_BAR2_RTI_STATUS );
1834+ bootstage = ioread32 (bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_BOOTSTAGE );
1835+ rti_status = ioread32 (bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_RTI_STATUS );
18241836
18251837 if (bootstage != 0 ) {
18261838 dev_err (& bcm4377 -> pdev -> dev , "bootstage is %d and not 0\n" ,
@@ -1854,15 +1866,18 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18541866 iowrite32 (BCM4377_DMA_MASK ,
18551867 bcm4377 -> bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE );
18561868
1857- iowrite32 (lower_32_bits (fw_dma ), bcm4377 -> bar2 + BCM4377_BAR2_FW_LO );
1858- iowrite32 (upper_32_bits (fw_dma ), bcm4377 -> bar2 + BCM4377_BAR2_FW_HI );
1859- iowrite32 (fw -> size , bcm4377 -> bar2 + BCM4377_BAR2_FW_SIZE );
1869+ iowrite32 (lower_32_bits (fw_dma ),
1870+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_FW_LO );
1871+ iowrite32 (upper_32_bits (fw_dma ),
1872+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_FW_HI );
1873+ iowrite32 (fw -> size ,
1874+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_FW_SIZE );
18601875 iowrite32 (0 , bcm4377 -> bar0 + BCM4377_BAR0_FW_DOORBELL );
18611876
18621877 dev_dbg (& bcm4377 -> pdev -> dev , "waiting for firmware to boot\n" );
18631878
18641879 ret = wait_for_completion_interruptible_timeout (& bcm4377 -> event ,
1865- BCM4377_TIMEOUT );
1880+ BCM4377_BOOT_TIMEOUT );
18661881 if (ret == 0 ) {
18671882 ret = - ETIMEDOUT ;
18681883 goto out_dma_free ;
@@ -1913,16 +1928,16 @@ static int bcm4377_setup_rti(struct bcm4377_data *bcm4377)
19131928 dev_dbg (& bcm4377 -> pdev -> dev , "RTI is in state 1\n" );
19141929
19151930 /* allow access to the entire IOVA space again */
1916- iowrite32 (0 , bcm4377 -> bar2 + BCM4377_BAR2_RTI_WINDOW_LO );
1917- iowrite32 (0 , bcm4377 -> bar2 + BCM4377_BAR2_RTI_WINDOW_HI );
1931+ iowrite32 (0 , bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_RTI_WINDOW_LO );
1932+ iowrite32 (0 , bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_RTI_WINDOW_HI );
19181933 iowrite32 (BCM4377_DMA_MASK ,
1919- bcm4377 -> bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE );
1934+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_RTI_WINDOW_SIZE );
19201935
19211936 /* setup "Converged IPC" context */
19221937 iowrite32 (lower_32_bits (bcm4377 -> ctx_dma ),
1923- bcm4377 -> bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO );
1938+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_LO );
19241939 iowrite32 (upper_32_bits (bcm4377 -> ctx_dma ),
1925- bcm4377 -> bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI );
1940+ bcm4377 -> bar2 + bcm4377 -> hw -> bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_HI );
19261941 iowrite32 (2 , bcm4377 -> bar0 + BCM4377_BAR0_RTI_CONTROL );
19271942
19281943 ret = wait_for_completion_interruptible_timeout (& bcm4377 -> event ,
@@ -2488,6 +2503,21 @@ static const struct bcm4377_hw bcm4377_hw_variants[] = {
24882503 .send_calibration = bcm4387_send_calibration ,
24892504 .send_ptb = bcm4378_send_ptb ,
24902505 },
2506+
2507+ [BCM4388 ] = {
2508+ .id = 0x4388 ,
2509+ .otp_offset = 0x415c ,
2510+ .bar2_offset = 0x200000 ,
2511+ .bar0_window1 = 0x18002000 ,
2512+ .bar0_window2 = 0x18109000 ,
2513+ .bar0_core2_window2 = 0x18106000 ,
2514+ .has_bar0_core2_window2 = true,
2515+ .broken_mws_transport_config = true,
2516+ .broken_le_coded = true,
2517+ .broken_le_ext_adv_report_phy = true,
2518+ .send_calibration = bcm4388_send_calibration ,
2519+ .send_ptb = bcm4378_send_ptb ,
2520+ },
24912521};
24922522
24932523#define BCM4377_DEVID_ENTRY (id ) \
@@ -2501,6 +2531,7 @@ static const struct pci_device_id bcm4377_devid_table[] = {
25012531 BCM4377_DEVID_ENTRY (4377 ),
25022532 BCM4377_DEVID_ENTRY (4378 ),
25032533 BCM4377_DEVID_ENTRY (4387 ),
2534+ BCM4377_DEVID_ENTRY (4388 ),
25042535 {},
25052536};
25062537MODULE_DEVICE_TABLE (pci , bcm4377_devid_table );
0 commit comments