Tomi Vainio - Sun Finland writes:
| I've used my Cisco WLAN with Toshiba Portege 3440 couple years but now
| it's broken.  I just upgraded to new Toshiba Tecra M1 and reinstalled
| FreeBSD there and now I get "an0: record length mismatch -- expected
| 430, got 440 for Rid ff68" errors.  I already tried with old laptop
| with latest kernel and old kernel from Jun 26th but it's also broken
| there so I cannot say who long this has been broken.

I assume you are using a pccard version.

It only a problem newer firmware.  It works ... just noisy!

You can try this patch to -current that should make it quiet.
There is a bug with -current and setting the TX speed that I need
to work on.  Looks like things changed in the wlan module.
I may commit this but there is an issue with the mpi-350 support.
They changed the programing paradigm and after 14 packets the 
TX engine stalls.  I'm still working on tweaks to that.
I had hoped to get that working and commit all of this.

Let me know how this works.  It should just work.

Doug A.

Index: sys/dev/an/if_aironet_ieee.h
===================================================================
RCS file: /cvs/src/sys/dev/an/if_aironet_ieee.h,v
retrieving revision 1.11
diff -c -r1.11 if_aironet_ieee.h
*** sys/dev/an/if_aironet_ieee.h        29 Dec 2002 19:22:06 -0000      1.11
--- sys/dev/an/if_aironet_ieee.h        19 Aug 2003 02:41:06 -0000
***************
*** 63,69 ****
   * data, which is 240 words long, so 256 should be a safe
   * value.
   */
! #define AN_MAX_DATALEN        512
  
  struct an_req {
        u_int16_t       an_len;
--- 63,69 ----
   * data, which is 240 words long, so 256 should be a safe
   * value.
   */
! #define AN_MAX_DATALEN        4096
  
  struct an_req {
        u_int16_t       an_len;
***************
*** 261,267 ****
        u_int32_t               an_uptime_usecs;        /* 0x178 */
        u_int32_t               an_uptime_secs;         /* 0x17C */
        u_int32_t               an_lostsync_better_ap;  /* 0x180 */
!       u_int32_t               an_rsvd[10];
  };
  
  /*
--- 261,267 ----
        u_int32_t               an_uptime_usecs;        /* 0x178 */
        u_int32_t               an_uptime_secs;         /* 0x17C */
        u_int32_t               an_lostsync_better_ap;  /* 0x180 */
!       u_int32_t               an_rsvd[15];
  };
  
  /*
***************
*** 337,342 ****
--- 337,343 ----
        u_int8_t                an_magic_packet_action; /* 0x98 */
        u_int8_t                an_magic_packet_ctl;    /* 0x99 */
        u_int16_t               an_rsvd9;
+       u_int16_t               an_spare[13];
  };
  
  #define AN_OPMODE_IBSS_ADHOC                  0x0000
***************
*** 417,422 ****
--- 418,435 ----
        char                    an_ssid3[32];
  };
  
+ struct an_ltv_ssid_entry{
+       u_int16_t               an_len;
+       char                    an_ssid[32];
+ };
+ 
+ #define MAX_SSIDS 25
+ struct an_ltv_ssidlist_new {
+       u_int16_t               an_len;
+       u_int16_t               an_type;
+       struct an_ltv_ssid_entry an_entry[MAX_SSIDS];
+ };
+ 
  /*
   * Valid AP list.
   */
***************
*** 501,507 ****
        u_int16_t               an_softcaps;            /* 0x7C */
        u_int16_t               an_bootblockrev;        /* 0x7E */
        u_int16_t               an_req_hw_support;      /* 0x80 */
!       u_int16_t               an_unknown;             /* 0x82 */
  };
  
  /*
--- 514,520 ----
        u_int16_t               an_softcaps;            /* 0x7C */
        u_int16_t               an_bootblockrev;        /* 0x7E */
        u_int16_t               an_req_hw_support;      /* 0x80 */
!       u_int16_t               an_unknown[31];         /* 0x82 */
  };
  
  /*
***************
*** 580,586 ****
        u_int8_t                an_avg_noise_prev_min_db;       /* 0x7D */
        u_int8_t                an_max_noise_prev_min_pc;       /* 0x7E */
        u_int8_t                an_max_noise_prev_min_db;       /* 0x7F */
!       u_int16_t               an_spare[5];
  };
  
  #define AN_STATUS_OPMODE_CONFIGURED           0x0001
--- 593,599 ----
        u_int8_t                an_avg_noise_prev_min_db;       /* 0x7D */
        u_int8_t                an_max_noise_prev_min_pc;       /* 0x7E */
        u_int8_t                an_max_noise_prev_min_db;       /* 0x7F */
!       u_int16_t               an_spare[8];
  };
  
  #define AN_STATUS_OPMODE_CONFIGURED           0x0001
Index: sys/dev/an/if_an.c
===================================================================
RCS file: /cvs/src/sys/dev/an/if_an.c,v
retrieving revision 1.51
diff -c -r1.51 if_an.c
*** sys/dev/an/if_an.c  28 Jun 2003 06:13:27 -0000      1.51
--- sys/dev/an/if_an.c  19 Aug 2003 02:41:06 -0000
***************
*** 313,319 ****
        device_t                dev;
  {
          struct an_softc *sc = device_get_softc(dev);
!       struct an_ltv_ssidlist  ssid;
        int     error;
  
        bzero((char *)&ssid, sizeof(ssid));
--- 313,319 ----
        device_t                dev;
  {
          struct an_softc *sc = device_get_softc(dev);
!       struct an_ltv_ssidlist_new      ssid;
        int     error;
  
        bzero((char *)&ssid, sizeof(ssid));
***************
*** 339,349 ****
        ssid.an_type = AN_RID_SSIDLIST;
  
          /* Make sure interrupts are disabled. */
          CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0);
          CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 0xFFFF);
  
        an_reset(sc);
-       /* No need for an_init_mpi350_desc since it will be done in attach */
  
        if (an_cmd(sc, AN_CMD_READCFG, 0))
                return(0);
--- 339,349 ----
        ssid.an_type = AN_RID_SSIDLIST;
  
          /* Make sure interrupts are disabled. */
+       sc->mpi350 = 0;
          CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0);
          CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 0xFFFF);
  
        an_reset(sc);
  
        if (an_cmd(sc, AN_CMD_READCFG, 0))
                return(0);
***************
*** 352,358 ****
                return(0);
  
        /* See if the ssid matches what we expect ... but doesn't have to */
!       if (strcmp(ssid.an_ssid1, AN_DEF_SSID))
                return(0);
  
        return(AN_IOSIZ);
--- 352,358 ----
                return(0);
  
        /* See if the ssid matches what we expect ... but doesn't have to */
!       if (strcmp(ssid.an_entry[0].an_ssid, AN_DEF_SSID))
                return(0);
  
        return(AN_IOSIZ);
***************
*** 715,721 ****
  
        /* Read ssid list */
        sc->an_ssidlist.an_type = AN_RID_SSIDLIST;
!       sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist);
        if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
                printf("an%d: read record failed\n", sc->an_unit);
                goto fail;
--- 715,721 ----
  
        /* Read ssid list */
        sc->an_ssidlist.an_type = AN_RID_SSIDLIST;
!       sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist_new);
        if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
                printf("an%d: read record failed\n", sc->an_unit);
                goto fail;
***************
*** 769,778 ****
        bcopy(AN_DEFAULT_NODENAME, sc->an_config.an_nodename,
            sizeof(AN_DEFAULT_NODENAME) - 1);
  
!       bzero(sc->an_ssidlist.an_ssid1, sizeof(sc->an_ssidlist.an_ssid1));
!       bcopy(AN_DEFAULT_NETNAME, sc->an_ssidlist.an_ssid1,
            sizeof(AN_DEFAULT_NETNAME) - 1);
!       sc->an_ssidlist.an_ssid1_len = strlen(AN_DEFAULT_NETNAME);
  
        sc->an_config.an_opmode =
            AN_OPMODE_INFRASTRUCTURE_STATION;
--- 769,779 ----
        bcopy(AN_DEFAULT_NODENAME, sc->an_config.an_nodename,
            sizeof(AN_DEFAULT_NODENAME) - 1);
  
!       bzero(sc->an_ssidlist.an_entry[0].an_ssid,
!             sizeof(sc->an_ssidlist.an_entry[0].an_ssid));
!       bcopy(AN_DEFAULT_NETNAME, sc->an_ssidlist.an_entry[0].an_ssid,
            sizeof(AN_DEFAULT_NETNAME) - 1);
!       sc->an_ssidlist.an_entry[0].an_len = strlen(AN_DEFAULT_NETNAME);
  
        sc->an_config.an_opmode =
            AN_OPMODE_INFRASTRUCTURE_STATION;
***************
*** 1088,1094 ****
        ifp->if_flags &= ~IFF_OACTIVE;
  
        if (!sc->mpi350) {
!               id = CSR_READ_2(sc, AN_TX_CMP_FID);
  
                if (status & AN_EV_TX_EXC) {
                        ifp->if_oerrors++;
--- 1089,1095 ----
        ifp->if_flags &= ~IFF_OACTIVE;
  
        if (!sc->mpi350) {
!               id = CSR_READ_2(sc, AN_TX_CMP_FID(sc->mpi350));
  
                if (status & AN_EV_TX_EXC) {
                        ifp->if_oerrors++;
***************
*** 1104,1115 ****
  
                AN_INC(sc->an_rdata.an_tx_cons, AN_TX_RING_CNT);
        } else { /* MPI 350 */
!               AN_INC(sc->an_rdata.an_tx_cons, AN_MAX_TX_DESC);
!               if (sc->an_rdata.an_tx_prod ==
!                   sc->an_rdata.an_tx_cons)
!                       sc->an_rdata.an_tx_empty = 1;
        }
- 
        return;
  }
  
--- 1105,1122 ----
  
                AN_INC(sc->an_rdata.an_tx_cons, AN_TX_RING_CNT);
        } else { /* MPI 350 */
!               id = CSR_READ_2(sc, AN_TX_CMP_FID(sc->mpi350));
!               if (!sc->an_rdata.an_tx_empty){
!                       if (status & AN_EV_TX_EXC) {
!                               ifp->if_oerrors++;
!                       } else
!                               ifp->if_opackets++;
!                       AN_INC(sc->an_rdata.an_tx_cons, AN_MAX_TX_DESC);
!                       if (sc->an_rdata.an_tx_prod ==
!                           sc->an_rdata.an_tx_cons)
!                               sc->an_rdata.an_tx_empty = 1;
!               }
        }
        return;
  }
  
***************
*** 1179,1188 ****
        CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0);
  
        status = CSR_READ_2(sc, AN_EVENT_STAT(sc->mpi350));
!       CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), ~AN_INTRS);
  
!       if (status & AN_EV_AWAKE) {
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_AWAKE);
        }
  
        if (status & AN_EV_LINKSTAT) {
--- 1186,1195 ----
        CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0);
  
        status = CSR_READ_2(sc, AN_EVENT_STAT(sc->mpi350));
!       CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), ~AN_INTRS(sc->mpi350));
  
!       if (status & AN_EV_MIC) {
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_MIC);
        }
  
        if (status & AN_EV_LINKSTAT) {
***************
*** 1199,1207 ****
                CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_RX);
        }
  
        if (status & AN_EV_TX) {
                an_txeof(sc, status);
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_TX);
        }
  
        if (status & AN_EV_TX_EXC) {
--- 1206,1221 ----
                CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_RX);
        }
  
+       if (sc->mpi350 && status & AN_EV_TX_CPY) {
+               an_txeof(sc, status);
+               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 
+                   AN_EV_TX_CPY);
+       }
+ 
        if (status & AN_EV_TX) {
                an_txeof(sc, status);
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 
!                   AN_EV_TX);
        }
  
        if (status & AN_EV_TX_EXC) {
***************
*** 1213,1219 ****
                CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_ALLOC);
  
        /* Re-enable interrupts. */
!       CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS);
  
        if ((ifp->if_flags & IFF_UP) && (ifp->if_snd.ifq_head != NULL))
                an_start(ifp);
--- 1227,1233 ----
                CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_ALLOC);
  
        /* Re-enable interrupts. */
!       CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS(sc->mpi350));
  
        if ((ifp->if_flags & IFF_UP) && (ifp->if_snd.ifq_head != NULL))
                an_start(ifp);
***************
*** 1238,1243 ****
--- 1252,1258 ----
                } else
                        break;
        }
+ 
        if( i == AN_TIMEOUT) {
                printf("BUSY\n");
                return(ETIMEDOUT);
***************
*** 1260,1266 ****
        reply->an_status = CSR_READ_2(sc, AN_STATUS(sc->mpi350));
  
        if (CSR_READ_2(sc, AN_COMMAND(sc->mpi350)) & AN_CMD_BUSY)
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_CLR_STUCK_BUSY);
  
        /* Ack the command */
        CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_CMD);
--- 1275,1282 ----
        reply->an_status = CSR_READ_2(sc, AN_STATUS(sc->mpi350));
  
        if (CSR_READ_2(sc, AN_COMMAND(sc->mpi350)) & AN_CMD_BUSY)
!               CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 
!                   AN_EV_CLR_STUCK_BUSY);
  
        /* Ack the command */
        CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_CMD);
***************
*** 1728,1734 ****
        struct ifaddr           *ifa;
        struct ifnet            *ifp;
        struct an_ltv_genconfig *cfg;
!       struct an_ltv_ssidlist  *ssid;
        struct an_ltv_aplist    *ap;
        struct an_ltv_gen       *sp;
  
--- 1744,1750 ----
        struct ifaddr           *ifa;
        struct ifnet            *ifp;
        struct an_ltv_genconfig *cfg;
!       struct an_ltv_ssidlist_new      *ssid;
        struct an_ltv_aplist    *ap;
        struct an_ltv_gen       *sp;
  
***************
*** 1748,1756 ****
                        sizeof(struct an_ltv_genconfig));
                break;
        case AN_RID_SSIDLIST:
!               ssid = (struct an_ltv_ssidlist *)areq;
                bcopy((char *)ssid, (char *)&sc->an_ssidlist,
!                       sizeof(struct an_ltv_ssidlist));
                break;
        case AN_RID_APLIST:
                ap = (struct an_ltv_aplist *)areq;
--- 1764,1772 ----
                        sizeof(struct an_ltv_genconfig));
                break;
        case AN_RID_SSIDLIST:
!               ssid = (struct an_ltv_ssidlist_new *)areq;
                bcopy((char *)ssid, (char *)&sc->an_ssidlist,
!                       sizeof(struct an_ltv_ssidlist_new));
                break;
        case AN_RID_APLIST:
                ap = (struct an_ltv_aplist *)areq;
***************
*** 1859,1865 ****
  {
        int                     error = 0;
        int                     len;
!       int                     i;
        struct an_softc         *sc;
        struct ifreq            *ifr;
        struct thread           *td = curthread;
--- 1875,1881 ----
  {
        int                     error = 0;
        int                     len;
!       int                     i, max;
        struct an_softc         *sc;
        struct ifreq            *ifr;
        struct thread           *td = curthread;
***************
*** 1869,1875 ****
        struct an_ltv_genconfig *config;
        struct an_ltv_key       *key;
        struct an_ltv_status    *status;
!       struct an_ltv_ssidlist  *ssids;
        int                     mode;
        struct aironet_ioctl    l_ioctl;
  
--- 1885,1891 ----
        struct an_ltv_genconfig *config;
        struct an_ltv_key       *key;
        struct an_ltv_status    *status;
!       struct an_ltv_ssidlist_new      *ssids;
        int                     mode;
        struct aironet_ioctl    l_ioctl;
  
***************
*** 1881,1887 ****
        config = (struct an_ltv_genconfig *)&sc->areq;
        key = (struct an_ltv_key *)&sc->areq;
        status = (struct an_ltv_status *)&sc->areq;
!       ssids = (struct an_ltv_ssidlist *)&sc->areq;
  
        if (sc->an_gone) {
                error = ENODEV;
--- 1897,1903 ----
        config = (struct an_ltv_genconfig *)&sc->areq;
        key = (struct an_ltv_key *)&sc->areq;
        status = (struct an_ltv_status *)&sc->areq;
!       ssids = (struct an_ltv_ssidlist_new *)&sc->areq;
  
        if (sc->an_gone) {
                error = ENODEV;
***************
*** 2004,2021 ****
                                        error = EINVAL;
                                        break;
                                }
!                               if (ireq->i_val == 0) {
!                                       len = ssids->an_ssid1_len;
!                                       tmpptr = ssids->an_ssid1;
!                               } else if (ireq->i_val == 1) {
!                                       len = ssids->an_ssid2_len;
!                                       tmpptr = ssids->an_ssid2;
!                               } else if (ireq->i_val == 2) {
!                                       len = ssids->an_ssid3_len;
!                                       tmpptr = ssids->an_ssid3;
!                               } else {
                                        error = EINVAL;
                                        break;
                                }
                        } else {
                                error = EINVAL;
--- 2020,2039 ----
                                        error = EINVAL;
                                        break;
                                }
!                               max = (sc->areq.an_len - 4)
!                                   / sizeof(struct an_ltv_ssid_entry);
!                               if ( max > MAX_SSIDS ) {
!                                       printf("To many SSIDs only using "
!                                           "%d of %d\n",
!                                           MAX_SSIDS, max);
!                                       max = MAX_SSIDS;
!                               }
!                               if (ireq->i_val > max) {
                                        error = EINVAL;
                                        break;
+                               } else {
+                                       len = ssids->an_entry[ireq->i_val].an_len;
+                                       tmpptr = ssids->an_entry[ireq->i_val].an_ssid;
                                }
                        } else {
                                error = EINVAL;
***************
*** 2032,2038 ****
                            IEEE80211_NWID_LEN);
                        break;
                case IEEE80211_IOC_NUMSSIDS:
!                       ireq->i_val = 3;
                        break;
                case IEEE80211_IOC_WEP:
                        sc->areq.an_type = AN_RID_ACTUALCFG;
--- 2050,2071 ----
                            IEEE80211_NWID_LEN);
                        break;
                case IEEE80211_IOC_NUMSSIDS:
!                       sc->areq.an_len = sizeof(sc->areq);
!                       sc->areq.an_type = AN_RID_SSIDLIST;
!                       if (an_read_record(sc,
!                           (struct an_ltv_gen *)&sc->areq)) {
!                               error = EINVAL;
!                               break;
!                       }
!                       max = (sc->areq.an_len - 4)
!                           / sizeof(struct an_ltv_ssid_entry);
!                       if ( max > MAX_SSIDS ) {
!                               printf("To many SSIDs only using "
!                                   "%d of %d\n",
!                                   MAX_SSIDS, max);
!                               max = MAX_SSIDS;
!                       }
!                       ireq->i_val = max;
                        break;
                case IEEE80211_IOC_WEP:
                        sc->areq.an_type = AN_RID_ACTUALCFG;
***************
*** 2228,2233 ****
--- 2261,2267 ----
                }
                switch (ireq->i_type) {
                case IEEE80211_IOC_SSID:
+                       sc->areq.an_len = sizeof(sc->areq);
                        sc->areq.an_type = AN_RID_SSIDLIST;
                        if (an_read_record(sc,
                            (struct an_ltv_gen *)&sc->areq)) {
***************
*** 2238,2261 ****
                                error = EINVAL;
                                break;
                        }
!                       switch (ireq->i_val) {
!                       case 0:
!                               error = copyin(ireq->i_data,
!                                   ssids->an_ssid1, ireq->i_len);
!                               ssids->an_ssid1_len = ireq->i_len;
!                               break;
!                       case 1:
!                               error = copyin(ireq->i_data,
!                                   ssids->an_ssid2, ireq->i_len);
!                               ssids->an_ssid2_len = ireq->i_len;
                                break;
!                       case 2:
                                error = copyin(ireq->i_data,
!                                   ssids->an_ssid3, ireq->i_len);
!                               ssids->an_ssid3_len = ireq->i_len;
!                               break;
!                       default:
!                               error = EINVAL;
                                break;
                        }
                        break;
--- 2272,2294 ----
                                error = EINVAL;
                                break;
                        }
!                       max = (sc->areq.an_len - 4)
!                           / sizeof(struct an_ltv_ssid_entry);
!                       if ( max > MAX_SSIDS ) {
!                               printf("To many SSIDs only using "
!                                   "%d of %d\n",
!                                   MAX_SSIDS, max);
!                               max = MAX_SSIDS;
!                       }
!                       if (ireq->i_val > max) {
!                               error = EINVAL;
                                break;
!                       } else {
                                error = copyin(ireq->i_data,
!                                   ssids->an_entry[ireq->i_val].an_ssid, 
!                                   ireq->i_len);
!                               ssids->an_entry[ireq->i_val].an_len 
!                                   = ireq->i_len;
                                break;
                        }
                        break;
***************
*** 2512,2518 ****
  
        /* Set the ssid list */
        sc->an_ssidlist.an_type = AN_RID_SSIDLIST;
!       sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist);
        if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
                printf("an%d: failed to set ssid list\n", sc->an_unit);
                AN_UNLOCK(sc);
--- 2545,2551 ----
  
        /* Set the ssid list */
        sc->an_ssidlist.an_type = AN_RID_SSIDLIST;
!       sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist_new);
        if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
                printf("an%d: failed to set ssid list\n", sc->an_unit);
                AN_UNLOCK(sc);
***************
*** 2548,2554 ****
                an_cmd(sc, AN_CMD_SET_MODE, 0xffff);
  
        /* enable interrupts */
!       CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS);
  
        ifp->if_flags |= IFF_RUNNING;
        ifp->if_flags &= ~IFF_OACTIVE;
--- 2581,2587 ----
                an_cmd(sc, AN_CMD_SET_MODE, 0xffff);
  
        /* enable interrupts */
!       CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS(sc->mpi350));
  
        ifp->if_flags |= IFF_RUNNING;
        ifp->if_flags &= ~IFF_OACTIVE;
***************
*** 2570,2576 ****
        int                     id, idx, i;
        unsigned char           txcontrol;
        struct an_card_tx_desc an_tx_desc;
-       u_int8_t                *ptr;
        u_int8_t                *buf;
  
        sc = ifp->if_softc;
--- 2603,2608 ----
***************
*** 2650,2657 ****
--- 2682,2715 ----
                                printf("an%d: xmit failed\n", sc->an_unit);
  
                        AN_INC(idx, AN_TX_RING_CNT);
+ 
+                       /*
+                        * Set a timeout in case the chip goes out to lunch.
+                        */
+                       ifp->if_timer = 5;
                }
        } else { /* MPI-350 */
+ /* HACK */
+               {
+                       struct an_command       cmd_struct;
+                       struct an_reply         reply;
+                       /*
+                        * Allocate TX descriptor
+                        */
+                       
+                       bzero(&reply,sizeof(reply));
+                       cmd_struct.an_cmd   = AN_CMD_ALLOC_DESC;
+                       cmd_struct.an_parm0 = AN_DESCRIPTOR_TX;
+                       cmd_struct.an_parm1 = AN_TX_DESC_OFFSET;
+                       cmd_struct.an_parm2 = AN_MAX_TX_DESC;
+                       if (an_cmd_struct(sc, &cmd_struct, &reply)) {
+                               printf("an%d: failed to allocate TX "
+                                   "descriptor\n", 
+                                   sc->an_unit);
+                               return;
+                       }
+               }
+ /* HACK */
                while (sc->an_rdata.an_tx_empty ||
                    idx != sc->an_rdata.an_tx_cons) {
                        IF_DEQUEUE(&ifp->if_snd, m0);
***************
*** 2697,2708 ****
                        an_tx_desc.an_eoc = 1;
                        an_tx_desc.an_valid = 1;
                        an_tx_desc.an_len =  0x44 +
!                               tx_frame_802_3.an_tx_802_3_payload_len;
!                       an_tx_desc.an_phys = sc->an_tx_buffer[idx].an_dma_paddr;
!                       ptr = (u_int8_t*)&an_tx_desc;
!                       for (i = 0; i < sizeof(an_tx_desc); i++) {
!                               CSR_MEM_AUX_WRITE_1(sc, AN_TX_DESC_OFFSET + i,
!                                                   ptr[i]);
                        }
  
                        /*
--- 2755,2769 ----
                        an_tx_desc.an_eoc = 1;
                        an_tx_desc.an_valid = 1;
                        an_tx_desc.an_len =  0x44 +
!                           tx_frame_802_3.an_tx_802_3_payload_len;
!                       an_tx_desc.an_phys 
!                           = sc->an_tx_buffer[idx].an_dma_paddr;
!                       for (i = 0; i < sizeof(an_tx_desc) / 4 ; i++) {
!                               CSR_MEM_AUX_WRITE_4(sc, AN_TX_DESC_OFFSET
!                                   /* zero for now */ 
!                                   + (0 * sizeof(an_tx_desc))
!                                   + (i * 4),
!                                   ((u_int32_t*)&an_tx_desc)[i]);
                        }
  
                        /*
***************
*** 2713,2723 ****
  
                        m_freem(m0);
                        m0 = NULL;
- 
-                       CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_ALLOC);
- 
                        AN_INC(idx, AN_MAX_TX_DESC);
                        sc->an_rdata.an_tx_empty = 0;
                }
        }
  
--- 2774,2787 ----
  
                        m_freem(m0);
                        m0 = NULL;
                        AN_INC(idx, AN_MAX_TX_DESC);
                        sc->an_rdata.an_tx_empty = 0;
+                       CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), AN_EV_ALLOC);
+ 
+                       /*
+                        * Set a timeout in case the chip goes out to lunch.
+                        */
+                       ifp->if_timer = 5;
                }
        }
  
***************
*** 2726,2736 ****
  
        sc->an_rdata.an_tx_prod = idx;
  
-       /*
-        * Set a timeout in case the chip goes out to lunch.
-        */
-       ifp->if_timer = 5;
- 
        return;
  }
  
--- 2790,2795 ----
***************
*** 3069,3081 ****
        int otype = sc->an_config.an_opmode;
        int orate = sc->an_tx_rate;
  
!       if ((sc->an_ifmedia.ifm_cur->ifm_media & IFM_IEEE80211_ADHOC) != 0)
!               sc->an_config.an_opmode = AN_OPMODE_IBSS_ADHOC;
!       else
!               sc->an_config.an_opmode = AN_OPMODE_INFRASTRUCTURE_STATION;
  
        sc->an_tx_rate = ieee80211_media2rate(
                IFM_SUBTYPE(sc->an_ifmedia.ifm_cur->ifm_media));
  
        if (orate != sc->an_tx_rate) {
                /* Read the current configuration */
--- 3128,3142 ----
        int otype = sc->an_config.an_opmode;
        int orate = sc->an_tx_rate;
  
! printf("Hello %d %d\n",
!        sc->an_tx_rate,
!        ieee80211_media2rate(
!               IFM_SUBTYPE(sc->an_ifmedia.ifm_cur->ifm_media)));
  
        sc->an_tx_rate = ieee80211_media2rate(
                IFM_SUBTYPE(sc->an_ifmedia.ifm_cur->ifm_media));
+       if (sc->an_tx_rate < 0)
+               sc->an_tx_rate = 0;
  
        if (orate != sc->an_tx_rate) {
                /* Read the current configuration */
***************
*** 3092,3097 ****
--- 3153,3163 ----
                sc->an_config.an_type = AN_RID_GENCONFIG;
                sc->an_config.an_len = sizeof(struct an_ltv_genconfig);
        }
+ 
+       if ((sc->an_ifmedia.ifm_cur->ifm_media & IFM_IEEE80211_ADHOC) != 0)
+               sc->an_config.an_opmode &= ~AN_OPMODE_INFRASTRUCTURE_STATION;
+       else
+               sc->an_config.an_opmode |= AN_OPMODE_INFRASTRUCTURE_STATION;
  
        if (otype != sc->an_config.an_opmode || 
            orate != sc->an_tx_rate)
Index: sys/dev/an/if_an_pci.c
===================================================================
RCS file: /cvs/src/sys/dev/an/if_an_pci.c,v
retrieving revision 1.21
diff -c -r1.21 if_an_pci.c
*** sys/dev/an/if_an_pci.c      1 Jul 2003 15:51:53 -0000       1.21
--- sys/dev/an/if_an_pci.c      19 Aug 2003 02:41:06 -0000
***************
*** 198,204 ****
                /* Allocate aux. memory */
                sc->mem_aux_rid = PCIR_MAPS + 8;
                error = an_alloc_aux_memory(dev, sc->mem_aux_rid, 
!                   AN_AUXMEMSIZE);
                if (error) {
                        printf("an%d: couldn't map aux memory\n", unit);
                        goto fail;
--- 198,204 ----
                /* Allocate aux. memory */
                sc->mem_aux_rid = PCIR_MAPS + 8;
                error = an_alloc_aux_memory(dev, sc->mem_aux_rid, 
!                   AN_AUX_MEM_SIZE);
                if (error) {
                        printf("an%d: couldn't map aux memory\n", unit);
                        goto fail;
Index: sys/dev/an/if_anreg.h
===================================================================
RCS file: /cvs/src/sys/dev/an/if_anreg.h,v
retrieving revision 1.17
diff -c -r1.17 if_anreg.h
*** sys/dev/an/if_anreg.h       8 Feb 2003 04:41:17 -0000       1.17
--- sys/dev/an/if_anreg.h       19 Aug 2003 02:41:06 -0000
***************
*** 95,101 ****
  /*
   * Size of aux. memory space ... probably not needed DJA 
   */
! #define AN_AUXMEMSIZE         (256 * 1024)
  
  /*
   * Hermes register definitions and what little I know about them.
--- 95,101 ----
  /*
   * Size of aux. memory space ... probably not needed DJA 
   */
! #define AN_AUX_MEM_SIZE               (256 * 1024)
  
  /*
   * Hermes register definitions and what little I know about them.
***************
*** 181,190 ****
        u_int64_t       an_phys;
  };
  
! #define AN_RID_BUFFER_SIZE    2048
! #define AN_RX_BUFFER_SIZE     1840
! #define AN_TX_BUFFER_SIZE     1840
! #define AN_HOST_DESC_OFFSET 0x8
  #define AN_RX_DESC_OFFSET  (AN_HOST_DESC_OFFSET + \
      sizeof(struct an_card_rid_desc))
  #define AN_TX_DESC_OFFSET (AN_RX_DESC_OFFSET + \
--- 181,191 ----
        u_int64_t       an_phys;
  };
  
! #define AN_RID_BUFFER_SIZE    AN_MAX_DATALEN
! #define AN_RX_BUFFER_SIZE     AN_HOSTBUFSIZ
! #define AN_TX_BUFFER_SIZE     AN_HOSTBUFSIZ
! /*#define AN_HOST_DESC_OFFSET 0xC sort of works */
! #define AN_HOST_DESC_OFFSET   0x800
  #define AN_RX_DESC_OFFSET  (AN_HOST_DESC_OFFSET + \
      sizeof(struct an_card_rid_desc))
  #define AN_TX_DESC_OFFSET (AN_RX_DESC_OFFSET + \
***************
*** 243,249 ****
  /* memory handle management registers */
  #define AN_RX_FID             0x20
  #define AN_ALLOC_FID          0x22
! #define AN_TX_CMP_FID         0x24
  
  /*
   * Buffer Access Path (BAP) registers.
--- 244,250 ----
  /* memory handle management registers */
  #define AN_RX_FID             0x20
  #define AN_ALLOC_FID          0x22
! #define AN_TX_CMP_FID(x)      (x ? 0x1a : 0x24)
  
  /*
   * Buffer Access Path (BAP) registers.
***************
*** 276,291 ****
  /* Events */
  #define AN_EV_CLR_STUCK_BUSY  0x4000  /* clear stuck busy bit */
  #define AN_EV_WAKEREQUEST     0x2000  /* awaken from PSP mode */
  #define AN_EV_AWAKE           0x0100  /* station woke up from PSP mode*/
  #define AN_EV_LINKSTAT                0x0080  /* link status available */
  #define AN_EV_CMD             0x0010  /* command completed */
  #define AN_EV_ALLOC           0x0008  /* async alloc/reclaim completed */
  #define AN_EV_TX_EXC          0x0004  /* async xmit completed with failure */
  #define AN_EV_TX              0x0002  /* async xmit completed succesfully */
  #define AN_EV_RX              0x0001  /* async rx completed */
  
! #define AN_INTRS      \
!       (AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC|AN_EV_LINKSTAT)
  
  /* Host software registers */
  #define AN_SW0(x)             (x ? 0x50 : 0x28)
--- 277,299 ----
  /* Events */
  #define AN_EV_CLR_STUCK_BUSY  0x4000  /* clear stuck busy bit */
  #define AN_EV_WAKEREQUEST     0x2000  /* awaken from PSP mode */
+ #define AN_EV_MIC             0x1000  /* Message Integrity Check*/
  #define AN_EV_AWAKE           0x0100  /* station woke up from PSP mode*/
  #define AN_EV_LINKSTAT                0x0080  /* link status available */
  #define AN_EV_CMD             0x0010  /* command completed */
  #define AN_EV_ALLOC           0x0008  /* async alloc/reclaim completed */
+ #define AN_EV_TX_CPY          0x0400
  #define AN_EV_TX_EXC          0x0004  /* async xmit completed with failure */
  #define AN_EV_TX              0x0002  /* async xmit completed succesfully */
  #define AN_EV_RX              0x0001  /* async rx completed */
  
! #define AN_INTRS(x)   \
!       ( x ? (AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_TX_CPY|AN_EV_ALLOC \
!              |AN_EV_LINKSTAT|AN_EV_MIC) \
!         : \
!             (AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC \
!              |AN_EV_LINKSTAT|AN_EV_MIC) \
!             )
  
  /* Host software registers */
  #define AN_SW0(x)             (x ? 0x50 : 0x28)
***************
*** 458,464 ****
        bus_dma_tag_t           an_dtag;
        struct an_ltv_genconfig an_config;
        struct an_ltv_caps      an_caps;
!       struct an_ltv_ssidlist  an_ssidlist;
        struct an_ltv_aplist    an_aplist;
          struct an_ltv_key     an_temp_keys[4];
        int                     an_tx_rate;
--- 466,472 ----
        bus_dma_tag_t           an_dtag;
        struct an_ltv_genconfig an_config;
        struct an_ltv_caps      an_caps;
!       struct an_ltv_ssidlist_new      an_ssidlist;
        struct an_ltv_aplist    an_aplist;
          struct an_ltv_key     an_temp_keys[4];
        int                     an_tx_rate;
Index: usr.sbin/ancontrol/ancontrol.c
===================================================================
RCS file: /cvs/src/usr.sbin/ancontrol/ancontrol.c,v
retrieving revision 1.20
diff -c -r1.20 ancontrol.c
*** usr.sbin/ancontrol/ancontrol.c      3 May 2003 21:06:35 -0000       1.20
--- usr.sbin/ancontrol/ancontrol.c      19 Aug 2003 02:41:06 -0000
***************
*** 101,109 ****
  #define ACT_DUMPAP 6
  
  #define ACT_SET_OPMODE 7
! #define ACT_SET_SSID1 8
! #define ACT_SET_SSID2 9
! #define ACT_SET_SSID3 10
  #define ACT_SET_FREQ 11
  #define ACT_SET_AP1 12
  #define ACT_SET_AP2 13
--- 101,107 ----
  #define ACT_DUMPAP 6
  
  #define ACT_SET_OPMODE 7
! #define ACT_SET_SSID 8
  #define ACT_SET_FREQ 11
  #define ACT_SET_AP1 12
  #define ACT_SET_AP2 13
***************
*** 648,665 ****
  static void an_dumpssid(iface)
        const char              *iface;
  {
!       struct an_ltv_ssidlist  *ssid;
        struct an_req           areq;
  
        areq.an_len = sizeof(areq);
        areq.an_type = AN_RID_SSIDLIST;
  
        an_getval(iface, &areq);
  
!       ssid = (struct an_ltv_ssidlist *)&areq;
!       printf("SSID 1:\t\t\t[ %.*s ]\n", ssid->an_ssid1_len, ssid->an_ssid1);
!       printf("SSID 2:\t\t\t[ %.*s ]\n", ssid->an_ssid2_len, ssid->an_ssid2);
!       printf("SSID 3:\t\t\t[ %.*s ]\n", ssid->an_ssid3_len, ssid->an_ssid3);
  
        return;
  }
--- 646,671 ----
  static void an_dumpssid(iface)
        const char              *iface;
  {
!       struct an_ltv_ssidlist_new      *ssid;
        struct an_req           areq;
+       int                     i, max;
  
        areq.an_len = sizeof(areq);
        areq.an_type = AN_RID_SSIDLIST;
  
        an_getval(iface, &areq);
  
!       max = (areq.an_len - 4) / sizeof(struct an_ltv_ssid_entry);
!       if ( max > MAX_SSIDS ) {
!               printf("To many SSIDs only printing %d of %d\n",
!                   MAX_SSIDS, max);
!               max = MAX_SSIDS;
!       }
!       ssid = (struct an_ltv_ssidlist_new *)&areq;
!       for (i = 0; i < max; i++)
!               printf("SSID %2d:\t\t\t[ %.*s ]\n", i + 1, 
!                   ssid->an_entry[i].an_len, 
!                   ssid->an_entry[i].an_ssid);
  
        return;
  }
***************
*** 1182,1217 ****
        int                     act;
        void                    *arg;
  {
!       struct an_ltv_ssidlist  *ssid;
        struct an_req           areq;
  
        areq.an_len = sizeof(areq);
        areq.an_type = AN_RID_SSIDLIST;
  
        an_getval(iface, &areq);
!       ssid = (struct an_ltv_ssidlist *)&areq;
  
!       switch (act) {
!       case ACT_SET_SSID1:
!               bzero(ssid->an_ssid1, sizeof(ssid->an_ssid1));
!               strlcpy(ssid->an_ssid1, (char *)arg, sizeof(ssid->an_ssid1));
!               ssid->an_ssid1_len = strlen(ssid->an_ssid1);
!               break;
!       case ACT_SET_SSID2:
!               bzero(ssid->an_ssid2, sizeof(ssid->an_ssid2));
!               strlcpy(ssid->an_ssid2, (char *)arg, sizeof(ssid->an_ssid2));
!               ssid->an_ssid2_len = strlen(ssid->an_ssid2);
!               break;
!       case ACT_SET_SSID3:
!               bzero(ssid->an_ssid3, sizeof(ssid->an_ssid3));
!               strlcpy(ssid->an_ssid3, (char *)arg, sizeof(ssid->an_ssid3));
!               ssid->an_ssid3_len = strlen(ssid->an_ssid3);
!               break;
!       default:
!               errx(1, "unknown action");
!               break;
        }
  
        an_setval(iface, &areq);
        exit(0);
  }
--- 1188,1223 ----
        int                     act;
        void                    *arg;
  {
!       struct an_ltv_ssidlist_new      *ssid;
        struct an_req           areq;
+       int                     max;
  
        areq.an_len = sizeof(areq);
        areq.an_type = AN_RID_SSIDLIST;
  
        an_getval(iface, &areq);
!       ssid = (struct an_ltv_ssidlist_new *)&areq;
  
!       max = (areq.an_len - 4) / sizeof(struct an_ltv_ssid_entry);
!       if ( max > MAX_SSIDS ) {
!               printf("To many SSIDs only printing %d of %d\n",
!                   MAX_SSIDS, max);
!               max = MAX_SSIDS;
!       }
! 
!       if ( act > max ) {
!               errx(1, "bad modifier %d: there "
!                   "are only %d SSID settings", act, max);
!               exit(1);
        }
  
+       bzero(ssid->an_entry[act-1].an_ssid, 
+           sizeof(ssid->an_entry[act-1].an_ssid));
+       strlcpy(ssid->an_entry[act-1].an_ssid, (char *)arg, 
+           sizeof(ssid->an_entry[act-1].an_ssid));
+       ssid->an_entry[act-1].an_len 
+           = strlen(ssid->an_entry[act-1].an_ssid);
+ 
        an_setval(iface, &areq);
        exit(0);
  }
***************
*** 1702,1724 ****
                        arg = optarg;
                        break;
                case 'n':
!                       switch(modifier) {
!                       case 0:
!                       case 1:
!                               act = ACT_SET_SSID1;
!                               break;
!                       case 2:
!                               act = ACT_SET_SSID2;
!                               break;
!                       case 3:
!                               act = ACT_SET_SSID3;
!                               break;
!                       default:
!                               errx(1, "bad modifier %d: there"
!                                   "are only 3 SSID settings", modifier);
!                               usage(p);
!                               break;
!                       }
                        arg = optarg;
                        break;
                case 'o':
--- 1708,1716 ----
                        arg = optarg;
                        break;
                case 'n':
!                       if (modifier == 0)
!                               modifier = 1;
!                       act = ACT_SET_SSID;
                        arg = optarg;
                        break;
                case 'o':
***************
*** 1800,1809 ****
        case ACT_DUMPRSSIMAP:
                an_dumprssimap(iface);
                break;
!       case ACT_SET_SSID1:
!       case ACT_SET_SSID2:
!       case ACT_SET_SSID3:
!               an_setssid(iface, act, arg);
                break;
        case ACT_SET_AP1:
        case ACT_SET_AP2:
--- 1792,1799 ----
        case ACT_DUMPRSSIMAP:
                an_dumprssimap(iface);
                break;
!       case ACT_SET_SSID:
!               an_setssid(iface, modifier, arg);
                break;
        case ACT_SET_AP1:
        case ACT_SET_AP2:
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to