In multi-hop wireless networks, earlier research on joint scheduling and congestion control has suggested that MAC-layer scheduling is the bottleneck. Distributed scheduling for maximal throughput is difficult since the conflicting relationship between different links is complex. Existing works on maximal-throughput scheduling usually assumes synchronized time slots, and in each slot, a maximal-weighted "independent set" needs to be found or approximated. However, this is hard to implement in distributed networks. On the other hand, a distributed greedy protocol similar to IEEE 802.11 can only achieve a fraction of the throughput region. In this paper, we introduce an adaptive CSMA algorithm, which can achieve the maximal throughput distributedly under some assumptions. The intuitive idea is that each link should adjust its aggressiveness of transmission based on its backlog. Furthermore, we combine the algorithm with end-to-end flow control to achieve fairness among competing flows. The effectiveness of the algorithm is verified by simulations.