The DLINK DWL-650 that I bought 5 years ago to an access point was in need of new firmware. The good news is that the linux hostap driver supports flashing firmware. There is even good documentation on how to do it.

I ran into a bit of snag, though:

prism2_srec -f wlan0 ./fw/p40003c0.hex ./fw/s1010701.hex

...

Verifying update compatibility and combining data:
NICID was not found from the list of supported platforms.
Incompatible update data.

Turns that I have v1.0.1 of the 0x8008 NICID, and the commonly available firmware only supports v1.0.0.

The flashing utility had a compatibility exception for downloading volatile firmware, but not non-volatile. A quick change(after testing the volatile firmware for a while) to the flashing utility remedied this:

        /* NICID was not found - reported compatability, if it is known to work
         * and non-volatile download is not used */
-       if (dl_mode == MODE_NON_VOLATILE)
-               return 0;
+//     if (dl_mode == MODE_NON_VOLATILE)
+//             return 0;
 

Most of the versions matched up, right?

prism2_srec -f wlan0 ./fw/p40003c0.hex ./fw/s1010701.hex

...

Verifying update compatibility and combining data:
Exact NICID was not found from the list of supported platforms, but an
alternative that has been reported to work was found.
PRI: old iface 1:1-2 new iface 0:1-2
Exact NICID was not found from the list of supported platforms, but an
alternative that has been reported to work was found.
Allowing S3 overlap due to CRC-16 signature at 0x003f17fe (was: ffff)
OK.

Downloading to non-volatile memory (flash).
Note! This can take about 30 seconds. Do _not_ remove card during download.
OK.
Components after download:
  NICID: 0x8008 v1.0.1
  PRIID: 0x0015 v0.3.0
  STAID: 0x001f v1.7.1