Brown ran 41 yards for the touchdown. For a quarter, it was vintage McNair.
The Tennessee quarterback took advantage of the NFL's worst defense by throwing for 343 yards and three touchdowns in the third quarter, including two within 80 seconds, and the Titans snapped a five-game losing streak by beating the 49ers 33-22 on Sunday.
"That is reminiscent of the old Steve," Titans coach Jeff Fisher said. "It was good to see."
Brown, who hasn't rushed for 100 yards in a game this season, caught three passes for 105 yards and a touchdown. Rob Bironas also
kicked a career-high four field goals. Kyle Vanden Bosch had two sacks, and the Titans (3-8) forced four turnovers in winning for the first time since Oct. 16.
McNair finished 23-of-41 in his best game since Oct. 12, 2003, when he threw for 421 yards against Houston in the season he shared MVP honors with Peyton Manning.
"Steve played amazing out there," Brown said. "I don't know how he found me because I thought he was sacked on that big play. It was a perfect pass."
It was the fifth time this season that the 49ers (2-9) had allowed a team to throw for more than 300 yards. The Titans finished with a season-high 461 yards total offense in a performance that disappointed San Francisco coach Mike Nolan.
"We gave up some explosive passes in the second half that hurt us, and an example, I guess, of what an experienced quarterback can do to an inexperienced secondary," Nolan said.
San Francisco recovered the ensuing onside kick. But with no timeouts left, the 49ers were already out of time before Vanden Bosch sacked Dorsey and forced the final turnover.
"We've come up short again," Nolan said.
The 49ers led 14-9 at halftime after the Titans had tried their best to take advantage of the NFL's worst defense by going with the no-huddle and even using rookie cornerback Pacman Jones on offense for a couple plays.
"Sometimes coaches dream wild things up after midnight, and I think that was the case," Fisher said.
But San Francisco ended its first visit to Tennessee with a fourth straight loss after McNair took control. He picked the 49ers apart by completing five of his seven passes in the third quarter for 142 yards.
First, he found Brown on a short pass for a 41-yard TD and a 16-14 lead. On the next offensive play, McNair connected with rookie Roydell Williams down the right sideline on a 50-yard TD 79 seconds later.
Then McNair drove the Titans 68 yards before finding Erron Kinney on a 4-yard toss at 4:54 of the third for a 30-14 lead.
The game featured plenty of the mistakes that have doomed both teams this season.
Tennessee could have led 14-0 after the first quarter if not for a holding penalty that wiped out a 35-yard TD run by Brown. Then a 26-yard run on a trick play featuring Jones was erased by an illegal block in the back penalty.
Linebacker Keith Bulluck intercepted a pass and ran it to the San Francisco 7 late in the second only to see the Titans settle for Bironas' third field goal of the half and a 9-7 lead.
The 49ers had trouble as well. Jose Cortez, signed on Friday to replace the injured Joe Nedney, bounced a 34-yard field-goal attempt off the left upright, and a holding penalty nullified a 75-yard TD run by Kevan Barlow.
Still, when Titans receiver Brandon Jones fell to the ground untouched with an injured right knee, Shawntae Spencer grabbed McNair's pass and returned it 61 yards for a score with 27 seconds left in the second quarter to give San Francisco the halftime lead.
It was McNair's 10th 300-yard passing game of his career and his 14th with three touchdowns. ... Brown caught a 57-yard pass in the first quarter that was the longest play this season and the team's longest reception since Justin McCareins caught a 73-yarder at Houston on Dec. 21, 2003. ... The 49ers are now 0-5 on the road this season.